【问题标题】:Recursive list traversal递归列表遍历
【发布时间】:2019-08-03 00:06:09
【问题描述】:

我需要遍历一个列表。列表的每个元素是最大跳跃。因此,如果我的起始位置是 5,那么我最多可以在列表中跳 5 个位置。但是如果列表的第 5 个元素是 0,那么它是一个无效的跳转,所以我必须将跳转减少 1。我想递归地这样做,但它每次都重复相同的数字。

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,
 ...]

直到最大递归错误。为什么我的pos不减值?

【问题讨论】:

  • 不清楚你描述的是什么算法。你能举几个输入和输出的例子,并解释一下输出是如何从输入中导出的吗?
  • “请调试我的代码”问题在 SO 上通常不太受欢迎。此外,第一个列表的输出似乎是错误的。最后,我认为这里不需要递归函数。
  • 第二种情况报错的原因是,找到0后,再尝试前面的1,但是位置又向前移动到了0,所以一直保持永远。因此,您的 pos 确实 减少了 1,但是列表值 there 将再次增加 1。您期望会发生什么?

标签: python arrays list recursion traversal


【解决方案1】:

while 条件不正确:

while lst[pos] + pos == 0:

你真的想检查列表中的值

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

但是当你减少pos 时,这仍然会留下一个问题:突然你会看到一个不同的lst[pos],而这确实应该保持不变。

所以,首先增加pos然后做循环会更有用:

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

如 cmets 中所述,这并不能防止算法卡住。如果你跳到一个零值,而前面的值是 1,那么你会一遍又一遍地跳到同一个零。

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 2014-03-01
    • 2021-10-05
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2012-03-27
    • 2013-07-13
    相关资源
    最近更新 更多