[英]Understanding recursive canSum function
我有一個 function,給定一個數字和一個數字列表,如果該數字可以由列表中的數字組成,則該數字可以根據需要多次使用:
def canSum(target_sum, numbers, memo = {}):
if target_sum in memo:
return memo[target_sum]
if target_sum == 0:
return True
if target_sum < 0:
return False
for n in numbers:
remainder = target_sum - n
if canSum(remainder, numbers) == True:
memo[target_sum] = True
return True, memo
memo[target_sum] = False
return False,memo
它應該返回True
和False
取決於是否可以通過在numbers
列表中添加任何數字任意時間來生成target_sum
。
例如canSum(4, [2])
應該返回True
因為2+2
是 4 等等。 但是我不明白我的錯誤在哪里,以下所有內容都應該返回True
。
canSum(4,[2])
# (False, {2: True, 4: False})
canSum(4,[2,1])
# (False, {2: True, 1: True, 3: True, 4: False})
canSum(4,[1,2])
# (True, {1: True, 2: True, 3: True, 4: True})
canSum(10,[2])
# (False, {2: True, 4: False, 6: False, 8: False, 10: False})
canSum(10,[2,3])
# (False, {2: True, 1: False, 4: False, 3: True, 6: False, 5: True, 8: False, 7: True, 10: False})
此外,是否有區別或需要將memo
傳遞給遞歸 function 調用? 這似乎沒有任何區別。
if canSum(remainder, numbers) == True: # -> if canSum(remainder, numbers, memo) == True:
memo[target_sum] = True
return True, memo
考慮當您調用canSum(0, [2])
時, function 將返回文字True
。 if canSum(0, [2]) == True
條件將被滿足。 但是當您調用canSum(2, [2])
時, function 將返回一個元組(True, {2: True})
並且if canSum(2, [2]) == True
條件將不被滿足。 因此,當您調用canSum(4, [2])
時, function 將返回(False, {2: True, 4: False})
。
每次通話都必須以相同的格式返回。 我認為這將是工作。
def canSum(target_sum, numbers, memo={}):
if target_sum in memo:
return memo[target_sum], memo
if target_sum == 0:
return True, memo
if target_sum < 0:
return False, memo
for n in numbers:
remainder = target_sum - n
if canSum(remainder, numbers)[0]:
memo[target_sum] = True
return True, memo
memo[target_sum] = False
return False, memo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.