代码:-
def canSum(targetSum, numbers, d={}):
if targetSum in d.keys():
return d[targetSum]
if targetSum == 0:
return True
if targetSum < 0:
return False
for each in numbers:
rem = targetSum - each
if canSum(rem, numbers, d):
d[targetSum] = True
return True
d[targetSum] = False
return False我的问题-
当我为testcase - print(canSum(7,2,4))运行上面的代码时,它返回false(这是正确的)。但是,当我对两个测试用例运行相同的代码时,即- print(canSum(7,3,5,4))和print(canSum(7,2,4)),它对这两种测试都返回true!(这是错误的)。
我不知道发生了什么。密码有问题吗?帮帮我。
发布于 2021-03-19 06:59:29
问题在于d的可变默认参数。
可变的默认值(如[]和{} )与该函数相关联,而不是该函数的特定调用。因此它将状态从一次调用传递到另一次调用。这就是为什么如果您多次运行代码就会失败的原因。简单地说,d不是第二次空的。
你甚至不需要d={}。如果删除它,您的代码就能正常工作。
def canSum(targetSum, numbers, d):
if targetSum in d.keys():
return d[targetSum]
if targetSum == 0:
return True
if targetSum < 0:
return False
for each in numbers:
rem = targetSum - each
if canSum(rem, numbers, d):
d[targetSum] = True
return True
d[targetSum] = False
return False
print(canSum(7, [2, 4], {}))
print(canSum(7, [3,5,4], {}))输出:
False
True如果您必须保持canSum的签名不变,请考虑定义一个将d={}放入递归函数调用中的包装器。
https://stackoverflow.com/questions/66703687
复制相似问题