Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python递归地通过给定的索引跳转或更少跳转遍历列表,同时避免使用零_Python_List_Recursion - Fatal编程技术网

Python递归地通过给定的索引跳转或更少跳转遍历列表,同时避免使用零

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

我试图写一个只有一个参数的函数,一个正整数列表

它必须是递归的,并确定您是否可以从开始到结束,同时避免在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 = 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],我不知道为什么。也许我应该放弃,抱歉评论太多了