Python递归地通过给定的索引跳转或更少跳转遍历列表,同时避免使用零
我试图写一个只有一个参数的函数,一个正整数列表 它必须是递归的,并确定您是否可以从开始到结束,同时避免在0上着陆。它必须从第一个值开始Python递归地通过给定的索引跳转或更少跳转遍历列表,同时避免使用零,python,list,recursion,Python,List,Recursion,我试图写一个只有一个参数的函数,一个正整数列表 它必须是递归的,并确定您是否可以从开始到结束,同时避免在0上着陆。它必须从第一个值开始list[0],但您可以跳转到全额或更少 比如说 list1 = [3,1,2,0,4,0,1] list2 = [3,2,1,0,2,0,2] 列表1应该返回True,因为您可以从3跳到2,从4跳到1 列表2应该返回False,因为无论您如何跳转,您都将在第一个0处着陆 以下是我迄今为止的尝试: def check_level(level): jump
list[0]
,但您可以跳转到全额或更少
比如说
list1 = [3,1,2,0,4,0,1]
list2 = [3,2,1,0,2,0,2]
列表1应该返回True
,因为您可以从3跳到2,从4跳到1
列表2应该返回False
,因为无论您如何跳转,您都将在第一个0处着陆
以下是我迄今为止的尝试:
def check_level(level):
jump = level[0]
if level[-1] == 0:
return False
elif jump == 0:
return False
elif jump == 0:
return False
elif len(level) > 1:
if level[jump] > len(level):
return True
elif level[-1] == 0:
return False
elif level[0] != 0:
if level[jump] == 0:
level[0] -= 1
return check_level(level)
else:
jump_index = level.index(level[jump])
new_level = level[jump_index:]
return check_level(new_level)
else:
return True
它不适用于所有示例,但对于其他示例,它会出现一个错误:
if level[jump] > len(level):
TypeError: '>' not supported between instances of 'list' and 'int'```
I am out of ideas on how to approach this and whether my approach is failed from the start... I hate recursion, hence I need to practice it.
一般逻辑是:
如果可以跳转到真实位置,则当前位置也是真实的
实施方式如下:
def checklevel(lst):
if not lst:
# no list is True (we are done)
return True
return any( checklevel(lst[i:]) for i in range(1,lst[0]+1))
list1 = [3,1,2,0,4,0,1]
list2 = [3,2,1,0,2,0,2]
assert checklevel(list1)
assert not checklevel(list2)
请注意,对于大型列表,这是一个糟糕的解决方案,在这种情况下,您应该尝试使用迭代dp表。在前进了许多位置后,您只需与列表的其余部分一起递归即可。在从1到第一个元素值的距离内执行此操作,即完成:
def jumpable(A):
if not A: return True # reaching end wins
return any(jumpable(A[i+1:]) for i in range(A[0])) # try all distances
输出:
print(jumpable([3,1,2,0,4,0,1])) # True
print(jumpable([3,2,1,0,2,0,2])) # False
为了避免创建浪费内存的临时列表,您可以向下传递索引(而不是子列表),并将其用作下一级递归的起点:
def jumpable(A,i=0):
if i>=len(A) : return True # reaching end
return any(jumpable(A,i+j+1) for j in range(A[i])) # try all distances
对于i=0的默认值,当从外部调用函数时,您的函数仍然只有一个参数。您需要更清楚地定义跳入代码或问题的含义?这是我要在列表索引中移动的空格数。在第一个列表中,位置0处的3向右移动三个空格,这将命中位置3,得到0。您的第一个列表似乎与该解释不一致。当登录到0时,它应该尝试以较小的幅度跳转,因此我尝试将第一个值更改为一个较小的新值。请不要通过破坏您的帖子为其他人做更多工作。通过在Stack Exchange网络上发布,您已授予Stack Exchange在下不可撤销的权利,以分发该内容(即,无论您未来的选择如何)。根据堆栈交换策略,帖子的非破坏版本是分发的版本。因此,任何故意破坏行为都将恢复原状。如果您想了解有关删除帖子的更多信息,请参阅:我对python相当陌生,正在尝试学习递归逻辑。这个算法的“物理”功能是什么?检查每个位置是否存在每个可能的跳跃?此外,如果不是lst,逻辑上什么是
?参数不是一个列表或它以0开始/结束?它测试每个可能的跳转,因此如果有2,它将尝试跳转1和跳转2,如果其中任何一个有效,它将返回true“not lst”如果lst为空(逻辑上这里您跳转到列表的结尾之外)则不适用于[2,0,3,0],我不知道为什么。也许我应该放弃,抱歉评论太多了