【发布时间】:2021-01-05 20:57:31
【问题描述】:
我有一个函数,给定一个数字和一个数字列表,如果该数字可以由 列表中的数字,其中数字可以根据需要多次使用:
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,这取决于target_sum 是否可以通过在numbers 列表中添加任意数量的任意时间来生成。
例如 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 传递给递归函数调用?这似乎没有任何区别。
if canSum(remainder, numbers) == True: # -> if canSum(remainder, numbers, memo) == True:
memo[target_sum] = True
return True, memo
【问题讨论】:
-
该死,我只是想检查
memo是如何构建的,导致错误,没有它一切正常,谢谢。