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
都设置为空。