[英]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.