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
相关产品推荐
相关产品推荐

