首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数,如果可以通过添加数字数组中的数字来实现targetSum,则返回布尔函数。

函数,如果可以通过添加数字数组中的数字来实现targetSum,则返回布尔函数。
EN

Stack Overflow用户
提问于 2021-03-19 06:50:10
回答 1查看 30关注 0票数 0

代码:-

代码语言:javascript
运行
复制
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!(这是错误的)。

我不知道发生了什么。密码有问题吗?帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-19 06:59:29

问题在于d的可变默认参数。

可变的默认值(如[]{} )与该函数相关联,而不是该函数的特定调用。因此它将状态从一次调用传递到另一次调用。这就是为什么如果您多次运行代码就会失败的原因。简单地说,d不是第二次空的。

你甚至不需要d={}。如果删除它,您的代码就能正常工作。

代码语言:javascript
运行
复制
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], {}))

输出:

代码语言:javascript
运行
复制
False
True

如果您必须保持canSum的签名不变,请考虑定义一个将d={}放入递归函数调用中的包装器。

阅读更多:"Least Astonishment" and the Mutable Default Argument

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66703687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档