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

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

 
Thread Tools Search this Thread
# 1  
Old 03-22-2018
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; 03-22-2018 at 09:44 PM.. Reason: typos
# 2  
Old 03-23-2018
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.
This User Gave Thanks to RudiC For This Post:
f77hack (03-23-2018)
# 3  
Old 03-23-2018
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
This User Gave Thanks to rbatte1 For This Post:
f77hack (03-23-2018)
# 4  
Old 03-23-2018
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; 03-23-2018 at 08:55 AM..
This User Gave Thanks to stomp For This Post:
f77hack (03-23-2018)
# 5  
Old 03-23-2018
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...
This User Gave Thanks to MadeInGermany For This Post:
f77hack (03-23-2018)
# 6  
Old 03-23-2018
Quote:
Originally Posted by rbatte1

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
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
Remark
Don't use global variables like this in a bigger script!
Thank you.

Last edited by f77hack; 03-23-2018 at 05:34 PM.. Reason: typo
# 7  
Old 03-24-2018
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; 03-24-2018 at 10:10 AM..
This User Gave Thanks to RudiC For This Post:
jim mcnamara (03-24-2018)

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
Reduce the number of lines by using Array samsan Shell Programming and Scripting 14 01-15-2015 08:36 PM
Need help on Assigning a Array variable from Background Functions mohan_kumarcs Shell Programming and Scripting 1 07-23-2014 02:38 AM
c++ code to check whether a list is circular or not vidyaj Programming 8 09-07-2010 05:35 PM
Passing array to functions in ksh script prasperl Shell Programming and Scripting 3 12-23-2009 02:00 PM
How to reduce code..... harshakusam Shell Programming and Scripting 1 04-30-2009 12:45 PM
Pls review this code and suggest if it can be written in a better way w020637 UNIX for Advanced & Expert Users 5 02-17-2009 06:02 PM
[ C ] multidemensional array pass to functions VRoemer Programming 3 12-08-2008 12:09 PM
Tricky array substitution in functions majormark Shell Programming and Scripting 6 11-12-2008 04:44 PM
Where can I review the source code? Aaron Van UNIX for Dummies Questions & Answers 1 09-08-2007 03:58 AM
Can someone review my code tell me where I am going wrong? chrchcol Shell Programming and Scripting 4 07-28-2006 07:54 PM
Can some review my code would be appreicated? sibghat Shell Programming and Scripting 1 09-29-2005 04:51 PM
a piece of code, plz help to review anypager Shell Programming and Scripting 0 07-20-2005 03:28 AM