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

为什么我写的Python递归解法无法正确求解LeetCode Combination Sum问题

解法差异说明

核心问题

你遇到的是Python可变对象的引用传递特性导致的问题,全程复用同一个列表实例追加到结果集,后续回溯操作会修改已存入的列表内容。

两个写法的差异对比

  • 正常运行的写法:
    递归调用时使用numbers+[candidates[i]]传参,该操作会生成全新的独立列表实例,每个符合条件被存入result的列表都不会被后续操作修改,因此结果正常。
  • 你的写法:
    全程操作同一个subset列表实例,执行res.append(subset)时仅存入了该列表的引用,后续递归返回后的subset.pop()操作会持续修改这个列表的内容,整个回溯流程结束后,所有存入res的引用指向的同一个列表已经被清空,所以你得到的全是空列表。

另外你代码里写的subset = []是无效操作,只是给函数内的局部变量重新赋值,不会修改实际传入的列表实例,可以直接删除。

修复方案

仅需要在追加结果时存储当前列表的副本即可,修改res.append(subset)为以下任意一种写法:

# 写法1
res.append(subset.copy())
# 写法2
res.append(list(subset))
# 写法3
res.append(subset[:])

修复后的完整代码:

def combinationSumMine(candidates, target):
    res = []
    def findCombos(subset):
        current_sum = sum(subset)
        if current_sum > target:
            return
        if current_sum == target:
            res.append(subset.copy())
            return
        for i in range(len(candidates)):
            subset.append(candidates[i])
            findCombos(subset)
            subset.pop()
    findCombos([])
    return res

运行后即可得到和正常写法一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:24:00