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

Python动态规划函数memo默认参数复用异常问题求助

问题原因分析

你遇到的问题核心是Python可变默认参数的特性:如果你的bestSum函数定义时把memo设为可变默认参数(比如def bestSum(n, arr, memo={}):),这个memo字典是在函数定义阶段就创建的,而不是每次调用函数时重新生成。

  • 第一次调用bestSum(8,[3,2])时,递归过程会把n=8对应的结果[2,3,3]存入这个全局绑定的memo字典;
  • 第二次调用bestSum(8, [4,2])时,因为你没手动传memo参数,函数会复用之前创建的那个memo字典,发现n=8已经有缓存值,直接返回旧结果,完全忽略了数组[4,2]的变化;
  • 单独调用第二个语句时,memo字典是空的,函数会基于[4,2]重新计算,得到正确的[4,4];
  • 调换调用顺序后,第一次调用的结果[4,4]被存入memo,第二次调用同样读取这个缓存,所以两个语句都返回[4,4]。

至于你疑惑的“memo未销毁且能被复用”:Python的函数默认参数会绑定在函数对象本身,属于函数的__defaults__属性的一部分。函数调用结束后,函数对象仍在内存中,所以这个默认参数不会被垃圾回收。虽然外部代码无法直接访问这个memo,但只要后续调用函数时没显式传入memo参数,就会自动复用这个绑定的字典。

修复方案

把可变默认参数改为None,在函数内部初始化memo字典,确保每次调用都生成新的缓存容器:

def bestSum(n, arr, memo=None):
    # 每次调用时初始化新的memo
    if memo is None:
        memo = {}
    # 你的递归逻辑开始
    if n in memo:
        return memo[n]
    if n == 0:
        return []
    if n < 0:
        return None
    
    shortest_combination = None
    for num in arr:
        remainder = n - num
        result = bestSum(remainder, arr, memo)
        if result is not None:
            combination = result + [num]
            if shortest_combination is None or len(combination) < len(shortest_combination):
                shortest_combination = combination
    
    memo[n] = shortest_combination
    return shortest_combination

这样修改后,每次调用bestSum时,只要没手动传入memo,都会创建新的空字典,不同调用之间的缓存完全隔离,就不会出现结果串用的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:29:59