首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >给定阵列的目标和

给定阵列的目标和
EN

Stack Overflow用户
提问于 2022-09-04 20:15:50
回答 1查看 132关注 0票数 -1

编写一个函数canSum(targetSum, numbers),它接受一个targetSum和一个数字数组作为参数。

该函数应该返回一个布尔值,指示是否可以使用数组中的数字生成targetSum。

动态程序

您可以根据需要多次使用数组的元素。

您可以假设所有输入数字都是非负的。

代码:

代码语言:javascript
运行
复制
def canSum(targetsum,numbers,memo={}):

    if targetsum in  memo:
        return memo[targetsum]

    if targetsum==0:
        return True

    if targetsum<0:
        return False

    for num in numbers:

        remainder=targetsum-num
        if (canSum(remainder,numbers,memo)==True):
            memo[targetsum]=True
            return True
            
    memo[targetsum]=True
    return False
print(canSum(7,[2,3]))

print(canSum(7,[5,3,4,7]))

print(canSum(7,[2,4]))

print(canSum(8,[2,3,5]))

print(canSum(300,[7,14]))

如果我称这些函数为真,它们都只打印为真。

但实际产出是

代码语言:javascript
运行
复制
true

true

false

true 

false

请帮我解决这个问题

EN

回答 1

Stack Overflow用户

发布于 2022-09-04 20:27:27

这是一个典型的错误,参见"Least Astonishment" and the Mutable Default Argument。大纲:不要使用可变的默认参数。您的固定版本可能如下所示(+我稍微重构了一下):

代码语言:javascript
运行
复制
def canSum(targetsum, numbers, memo=None):
    if memo is None:
        memo = {}

    if targetsum in memo:
        return memo[targetsum]

    if targetsum < 0:
        return False

    if targetsum == 0:
        return True

    for num in numbers:
        remainder = targetsum - num
        res = memo[targetsum] = canSum(remainder, numbers, memo)
        if res:
            return res

    return memo[targetsum]


print(canSum(7, [2, 3]))

print(canSum(7, [5, 3, 4, 7]))

print(canSum(7, [2, 4]))

print(canSum(8, [2, 3, 5]))

print(canSum(300, [7, 14]))

输出:

代码语言:javascript
运行
复制
True
True
False
True
False
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73602548

复制
相关文章

相似问题

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