簡體   English   中英

Python 以給定的索引跳轉或更少的方式遞歸地跳轉列表,同時避免零

[英]Python recursively jumping through a list by a given index jump or less while avoiding zeros

我正在嘗試編寫一個只有一個參數的 function,一個正整數列表。

它必須是遞歸的,並找到是否可以從頭到尾同時避免落在 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.

大體邏輯是:

“如果能跳到一個True position,當前position也是True”

像這樣實現:

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-table。

在前進了一些位置之后,您只需遞歸列表的 rest。 對從 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

為避免創建 memory 浪費臨時列表,您可以向下傳遞索引(而不是子列表)並將其用作下一級遞歸的起點:

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 的默認值,你 function 從外部調用時仍然只有一個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM