You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bestsum记忆化函数输出结果异常问题排查求助

BestSum记忆化函数异常分析与修复

异常原因

1. 可变默认参数的陷阱

Python中函数的默认参数在函数定义阶段就会被初始化,而非每次调用时重新创建。你的代码用memo={}作为默认参数,意味着多次调用bestsum若不手动传入memo,会复用同一个字典,之前调用的残留数据会直接干扰后续计算,导致结果混乱。

2. 直接修改递归返回的列表引用

代码中result.append(i)直接修改了递归返回的列表(该列表可能是从memo中取出的引用),这会导致memo中存储的原始列表被意外篡改。后续递归调用拿到的是已被修改过的列表,最终让最短组合的判断逻辑完全失效。

比如测试bestsum(15,[3,2,5])时,先遍历3,递归得到的列表被append(3)修改,memo里对应余数的结果被篡改,后续遍历2和5时拿到的是变长的错误列表,最终错误选择了全3的组合。

解决方法

1. 修复可变默认参数问题

将memo的默认参数改为None,在函数内部初始化空字典,确保每次未传memo的调用都使用新字典:

def bestsum(targetsum, numbers, memo=None):
    if memo is None:
        memo = {}

2. 避免修改原始列表引用

不要直接对递归返回的result执行append操作,而是创建新列表存储当前组合:

combination = result + [num]

这样既不会修改memo中的原始数据,也能正确生成当前路径的组合。

修正后的完整代码

def bestsum(targetsum, numbers, memo=None):
    if memo is None:
        memo = {}
    if targetsum in memo:
        return memo[targetsum]
    if targetsum == 0:
        return []
    elif targetsum < 0:
        return None
    shortest = None

    for num in numbers:
        remainder = targetsum - num
        result = bestsum(remainder, numbers, memo)
        if result is not None:
            combination = result + [num]
            if shortest is None or len(combination) < len(shortest):
                shortest = combination
    
    memo[targetsum] = shortest
    return shortest

测试验证

  • 调用print(bestsum(15, [3,2,5])),输出正确最短组合[5,5,5]
  • 调用print(bestsum(15, [5,2,3])),同样输出[5,5,5]
  • 调用print(bestsum(100, [5,3,2,25])),输出最优解[25,25,25,25]

内容的提问来源于stack exchange,提问作者Venkata Jayanarayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:37:32