简体   繁体   中英

Recursive list traversal

I need to traverse a list. Each element of the list is the maximum jump. So if my starter position is 5, then i can jump maximum 5 positon in the list. But if the 5th element of the list is 0, then it's an invalid jump, so i have to reduce the jump by 1. I want to do this recursively, but it keep repeating the same number every time.

def traverse(lst,pos,out):
    out.append(pos)
    try:
        while lst[pos] + pos == 0:
            pos = pos - 1
        pos += lst[pos]
        traverse(lst,pos,out)       
    except IndexError:
        print(out[:-1] + ['out'])

c2 = [3,5,1,2,5,1,4]
traverse(c2,c2[0],out)

output: [3, 5,'out']

c3 =  [3,5,1,0,5,1,4] #So i changed the 3th value to 0
traverse(c3,c3[0],out)

output:
 3,
 3,
 3,
 3,
 ...]

Until maximum recursive error. Why isnt my pos reducing the value?

The while condition does not do the right thing:

while lst[pos] + pos == 0:

You really want to check the value in the list :

while lst[lst[pos] + pos] == 0:

But that still leaves a problem when you decrease pos : suddenly you will be looking at a different lst[pos] , while that really should stay fixed.

So, it will be more useful to first increase the pos and then do the loop:

pos += lst[pos]       # move this here, before the loop
while lst[pos] == 0:  # corrected condition
    pos = pos - 1

As noted in comments, this does not prevent the algorithm to get stuck. If you jump to a value that is zero, and the preceding value is a 1, then you'll keep jumping into that same zero over and over again.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM