为什么在递归问题中添加备忘录会给出错误的结果,而删除备忘录会给出正确的答案



Q。编写一个函数";canSum(target_sum,数字("它将targetsum和一组数字作为参数。函数应返回一个布尔值,指示是否可以使用数组中的数字生成target_sum

  • 您可以根据需要多次使用数组中的一个元素。你可以假设所有数字都是非负数。

  • 例如:canSum(7,[1,2,5,3,7](->真实

  • 例如:canSum(7,[2,4,9,6](-->错误

这是我的解决方案,但它只在我删除记忆时有效

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 num in numbers:
if canSum(target_sum - num, numbers, memo) == True:
memo[target_sum] = True # removing this gives expected output.
return True
memo[target_sum] = False # removing this gives expected output.
return False
if __name__ == "__main__":
print(canSum(7, [2, 5, 7])) # Output: True
print(canSum(7, [2, 4])) # Output: True (while it should be false).

删除备忘录后,现在它可以正常工作。请帮忙,我不知道为什么会发生这种事。

for num in numbers:
if canSum(target_sum - num, numbers, memo) == True:
return True
return False
# Now it works fine.

我最终找到了答案。在以前的代码canSum(target_sum, numbers, memo={}中,memo对于所有函数调用都是相同的

我的意思是,对于CCD_ 3和CCD_ 4,CCD_。

因此,当它第二次调用函数时,它会检查之前存储的密钥并根据它返回

if target_sum in memo:
return memo[target_sum]

这就是所有这些食尸鬼砍伤发生的地方。

这是我更正的代码。

def canSum(target_sum, numbers):
memo = {}
return memoCanSum(target_sum, numbers, memo)

def memoCanSum(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 num in numbers:
if memoCanSum(target_sum - num, numbers, memo) == True:
memo[target_sum] = True
return True
memo[target_sum] = False
return False

if __name__ == "__main__":
print(canSum(7, [2, 5, 7])) # Output: True
print(canSum(7, [2, 4])) # Output: False
print(canSum(9, [2, 4])) # Output: False

这里,另一个函数被创建为memoCanSum(target_sum, numbers, memo),并从canSum(target_sum, numbers)调用它。现在,每次调用canSum时,它都会正常工作,因为在每次调用中,memo都设置为空。

最新更新