Home Man
Search
Today's Posts
Register

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

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

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

Login to Reply

 
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 08: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.
The Following User Says Thank You to RudiC For This Useful 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
The Following User Says Thank You to rbatte1 For This Useful 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 07:55 AM..
The Following User Says Thank You to stomp For This Useful 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...
The Following User Says Thank You to MadeInGermany For This Useful 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 04: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 09:10 AM..
The Following User Says Thank You to RudiC For This Useful Post:
jim mcnamara (03-24-2018)
Login to Reply

« Previous Thread | Next Thread »
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

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
Passing array to functions in ksh script prasperl Shell Programming and Scripting 3 12-23-2009 01:00 PM
How to reduce code..... harshakusam Shell Programming and Scripting 1 04-30-2009 11:45 AM
[ 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
Where can I review the source code? Aaron Van UNIX for Dummies Questions & Answers 1 09-08-2007 02:58 AM
Can someone review my code tell me where I am going wrong? chrchcol Shell Programming and Scripting 4 07-28-2006 06:54 PM


All times are GMT -4. The time now is 05:21 PM.

Unix & Linux Forums Content Copyrightę1993-2018. All Rights Reserved.
UNIX.COM Login
Username:
Password:  
Show Password