Unix/Linux Go Back    


Programming Post questions about C, C++, Java, SQL, and other programming languages here.

Code review: recursion in circular array, reduce two functions to one?

Programming


Tags
bash, c++, code review, perl, swift

Reply    
 
Thread Tools Search this Thread Display Modes
    #1  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
f77hack's Unix or Linux Image
f77hack f77hack is offline
Registered User
 
Join Date: Jan 2016
Last Activity: 16 April 2018, 10:03 PM EDT
Location: 3rd planet
Posts: 32
Thanks: 27
Thanked 1 Time in 1 Post
Code review: recursion in circular array, reduce two functions to one?

Hello,
I think there's an easier way to do this but can't seem to recall but given an array of animals[0...5] and an initial value is a random index in the array, here it's 3.

3,4,5,4,3,2,1,0,1,2,3,4,5,4,3,2,1,0... inifinite repeat

a quick brute force solution i came up with was two functions, i set a limit of 20 so it doesn't become a memory bomb. there would be some kind of other conditional break point.



Code:
func fwd()
{
  counter += 1
  while(currentRow < (animals.count - 1))
  { currentRow += 1 }
  if counter < 20 { bk() }
}

func bk()
{
  counter += 1
  while(currentRow > 0)
  { currentRow -= 1 }
  if counter < 20 { fwd () }
}

fwd()


Last edited by f77hack; 4 Weeks Ago at 08:44 PM.. Reason: typos
Sponsored Links
    #2  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
RudiC's Unix or Linux Image
RudiC RudiC is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 21 April 2018, 1:54 PM EDT
Location: Aachen, Germany
Posts: 12,504
Thanks: 401
Thanked 3,877 Times in 3,564 Posts
That spec is beyond me. Mayhap others, with some assumptions on e.g. shell and data structure, find a sensible interpratation of what you write.

For an index not to exceed array boundaries the modulo operator has proven quite helpful.
The Following User Says Thank You to RudiC For This Useful Post:
f77hack (4 Weeks Ago)
Sponsored Links
    #3  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
rbatte1's Unix or Linux Image
rbatte1 rbatte1 is offline Forum Staff  
Root armed
 
Join Date: Jun 2007
Last Activity: 20 April 2018, 12:32 PM EDT
Location: Lancashire, UK
Posts: 3,510
Thanks: 1,544
Thanked 689 Times in 619 Posts
Maybe you could have an adjustment value that you would always add. When the counter gets high, you set the adjustment value to -1. When it gets back to zero, you set it to 1. That way, you only have one function plus a decision to make about if you need to change the adjustment value:-

Code:
adjval=1
counter=0
currentRow=0

function adjust_it ()
{
 ((counter=$counter+1))
 ((currentRow=$currentRow+$adjval))
 [ $currentRow -le 0 ] && adjval=1                # We set it to count up
 [ $currentRow -ge 5 ] && adjval=-1               # We set it to count down
 echo "Counter is $counter ; CurrentRow is $currentRow ; Adjustment value is $adjval"
}

Then, a simple loop will illustrate it:-

Code:
$ while :
> do
> adjust_it
> sleep 1
> done
Counter is 1 ; CurrentRow is 1 ; Adjustment value is 1
Counter is 2 ; CurrentRow is 2 ; Adjustment value is 1
Counter is 3 ; CurrentRow is 3 ; Adjustment value is 1
Counter is 4 ; CurrentRow is 4 ; Adjustment value is 1
Counter is 5 ; CurrentRow is 5 ; Adjustment value is -1
Counter is 6 ; CurrentRow is 4 ; Adjustment value is -1
Counter is 7 ; CurrentRow is 3 ; Adjustment value is -1
Counter is 8 ; CurrentRow is 2 ; Adjustment value is -1
Counter is 9 ; CurrentRow is 1 ; Adjustment value is -1
Counter is 10 ; CurrentRow is 0 ; Adjustment value is 1
Counter is 11 ; CurrentRow is 1 ; Adjustment value is 1
Counter is 12 ; CurrentRow is 2 ; Adjustment value is 1
Counter is 13 ; CurrentRow is 3 ; Adjustment value is 1
Counter is 14 ; CurrentRow is 4 ; Adjustment value is 1
Counter is 15 ; CurrentRow is 5 ; Adjustment value is -1
Counter is 16 ; CurrentRow is 4 ; Adjustment value is -1
Counter is 17 ; CurrentRow is 3 ; Adjustment value is -1
Counter is 18 ; CurrentRow is 2 ; Adjustment value is -1
Counter is 19 ; CurrentRow is 1 ; Adjustment value is -1
Counter is 20 ; CurrentRow is 0 ; Adjustment value is 1
Counter is 21 ; CurrentRow is 1 ; Adjustment value is 1
Counter is 22 ; CurrentRow is 2 ; Adjustment value is 1
Counter is 23 ; CurrentRow is 3 ; Adjustment value is 1
Counter is 24 ; CurrentRow is 4 ; Adjustment value is 1
Counter is 25 ; CurrentRow is 5 ; Adjustment value is -1
Counter is 26 ; CurrentRow is 4 ; Adjustment value is -1
Counter is 27 ; CurrentRow is 3 ; Adjustment value is -1
Counter is 28 ; CurrentRow is 2 ; Adjustment value is -1
Counter is 29 ; CurrentRow is 1 ; Adjustment value is -1



Does that help, or have I missed the point?
Robin
The Following User Says Thank You to rbatte1 For This Useful Post:
f77hack (4 Weeks Ago)
    #4  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
stomp's Unix or Linux Image
stomp stomp is offline
Registered User
 
Join Date: May 2016
Last Activity: 17 April 2018, 7:00 AM EDT
Posts: 212
Thanks: 10
Thanked 73 Times in 68 Posts


Code:
#!/bin/bash

max=5

next() {
  [ $counter -eq 0    ] || [ -z "$last" ] && change="1"
  [ $counter -eq $max ]                   && change="-1"
  last=$counter
  ((counter=$counter + $change))
}

counter=$(($RANDOM%($max+1)))
for((i=0;$i<20;i++));do
        echo $counter
        next
done

Remark
Don't use global variables like this in a bigger script!

Last edited by stomp; 4 Weeks Ago at 07:55 AM..
The Following User Says Thank You to stomp For This Useful Post:
f77hack (4 Weeks Ago)
Sponsored Links
    #5  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
MadeInGermany's Unix or Linux Image
MadeInGermany MadeInGermany is offline Forum Staff  
Moderator
 
Join Date: May 2012
Last Activity: 21 April 2018, 10:56 AM EDT
Location: Simplicity
Posts: 4,036
Thanks: 346
Thanked 1,356 Times in 1,222 Posts
The recursion seems strange.
Better go for an iteration: an outer loop with counter, and two loops inside (one fwd then one bk).
BTW this is not shell code...
The Following User Says Thank You to MadeInGermany For This Useful Post:
f77hack (4 Weeks Ago)
Sponsored Links
    #6  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
f77hack's Unix or Linux Image
f77hack f77hack is offline
Registered User
 
Join Date: Jan 2016
Last Activity: 16 April 2018, 10:03 PM EDT
Location: 3rd planet
Posts: 32
Thanks: 27
Thanked 1 Time in 1 Post
Quote:
Originally Posted by rbatte1 View Post

Does that help, or have I missed the point?
Robin
Hello Robin, that definitely helps. The original code is swift but I don't mind if code is bash, perl... I just need to see some code that works.
Thank you.

---------- Post updated at 03:34 PM ---------- Previous update was at 03:25 PM ----------

Quote:
Originally Posted by RudiC View Post
For an index not to exceed array boundaries the modulo operator has proven quite helpful.
Thanks for the input. I gave that a try but couldn't quite work out how to flip the counter to count down negative. I'm not that informed on how to flip the pointer.

---------- Post updated at 03:38 PM ---------- Previous update was at 03:34 PM ----------

Quote:
Originally Posted by stomp View Post
Remark
Don't use global variables like this in a bigger script!
Thank you.

Last edited by f77hack; 4 Weeks Ago at 04:34 PM.. Reason: typo
Sponsored Links
    #7  
Old Unix and Linux 4 Weeks Ago   -   Original Discussion by f77hack
RudiC's Unix or Linux Image
RudiC RudiC is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 21 April 2018, 1:54 PM EDT
Location: Aachen, Germany
Posts: 12,504
Thanks: 401
Thanked 3,877 Times in 3,564 Posts
Ohhh - got it . . . Try - recent bash (ksh) required -


Code:
animals=(Lion Tiger Panther Cougar Cheetah Leopard)
DLT=1
IDX=3
for i in {1..20}
  do    echo $IDX: ${animals[IDX]}
        (( IDX % (${#animals[@]}-1) )) || (( DLT *= -1 ))
        (( IDX += DLT))
  done
3: Cougar
4: Cheetah
5: Leopard
4: Cheetah
3: Cougar
2: Panther
1: Tiger
0: Lion
1: Tiger
2: Panther
3: Cougar
4: Cheetah
5: Leopard
4: Cheetah
3: Cougar
2: Panther
1: Tiger
0: Lion
1: Tiger
2: Panther


Last edited by RudiC; 4 Weeks Ago at 09:10 AM..
The Following User Says Thank You to RudiC For This Useful Post:
jim mcnamara (4 Weeks Ago)
Sponsored Links
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Reduce the number of lines by using Array samsan Shell Programming and Scripting 14 01-15-2015 07:36 PM
Need help on Assigning a Array variable from Background Functions mohan_kumarcs Shell Programming and Scripting 1 07-23-2014 01:38 AM
c++ code to check whether a list is circular or not vidyaj Programming 8 09-07-2010 04:35 PM
[ C ] multidemensional array pass to functions VRoemer Programming 3 12-08-2008 11:09 AM
Tricky array substitution in functions majormark Shell Programming and Scripting 6 11-12-2008 03:44 PM



All times are GMT -4. The time now is 07:25 PM.