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

为何bestSum函数返回的列表会追加无关元素?

问题分析与修复

你的代码核心问题是直接修改了递归返回的可变列表对象,导致memo缓存的结果被污染,后续递归调用拿到的是已经被修改过的数组,最终生成错误的长组合。

具体来说,这段代码:

remaindercombo.append(num)

remaindercombo是递归调用返回的列表(可能已经被存入memo),直接append会修改原列表,当其他分支再次访问memo中的该值时,拿到的是已经添加了新元素的版本,从而导致组合长度异常增长。

修复方案

创建新的列表来存储当前组合,避免修改原列表:

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

    shortcombo = None
    
    for num in numbers:
        remainder = targetsum - num
        remaindercombo = bestsum(remainder, numbers, memo)
        
        if remaindercombo is not None:
            # 创建新列表,不修改原remaindercombo
            new_combo = remaindercombo + [num]
            if shortcombo is None or len(new_combo) < len(shortcombo):
                shortcombo = new_combo
    memo[targetsum] = shortcombo 
    return shortcombo

print(bestsum(7,[5,3,4,7]))
print(bestsum(8,[2,3,5]))
print(bestsum(8,[1,4,5]))
print(bestsum(100,[1,2,5,25]))

修复原理

  • 使用remaindercombo + [num]创建新列表,原递归返回的列表(包括memo中缓存的)不会被修改,保证每个递归分支的组合都是独立的。
  • 这样memo中存储的始终是对应targetsum的最短组合,后续调用能正确获取到未被篡改的缓存值。

运行修复后的代码,就能得到你期望的输出:

[7]
[5, 3]
[4, 4]
[25, 25, 25, 25]

内容的提问来源于stack exchange,提问作者singam suresh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:50:30