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

使用DFS生成固定长度和为指定数的列表时,局部结果无法存入全局列表

问题分析与解决方案

我一眼就看出问题出在哪了——你在往res里添加的是列表temp的引用,而不是一个独立的副本!

为什么会出现“打印有内容,返回为空”的情况?

当你执行res.append(temp)时,并没有把当前temp里的元素复制一份存到res里,而是把temp这个列表对象的“地址”存了进去。后续你调用temp.pop()的时候,会直接修改这个地址指向的列表内容。虽然在print(res, y)的时候,temp还没被pop,所以能看到有值,但等整个DFS递归结束后,temp被清空了,res里所有的元素其实都是指向同一个空列表的引用,自然返回的时候就全是空的了。

怎么修复?

只需要在添加到res的时候,创建一个temp的副本就行,常见的两种写法:

  • res.append(temp.copy())
  • res.append(list(temp))

修改后的代码如下:

class Solution: 
    def connect(self , m , n ): 
        res = [] 
        def helper(x, y, temp): 
            # 去掉res参数,直接用外层的res更简洁
            if len(temp) == y: 
                temp.sort() 
                res.append(temp.copy())  # 关键:添加副本而非引用
                return 
            if x >= 0: 
                for i in range(0, x+1): 
                    temp.append(i) 
                    helper(x - i, y, temp) 
                    temp.pop() 
        temp = [] 
        helper(m, n, temp) 
        return res 

# 测试验证
print(Solution().connect(5, 3))

额外优化建议

  1. 去掉helper函数里的res参数:外层函数已经定义了res,可以直接访问,减少参数传递的冗余。
  2. 提前控制元素顺序:如果不想在每次递归里排序,也可以在递归选择元素时就按非降序取值(比如range(i, x+1)),这样既能避免重复排序,还能自动过滤掉重复的无序组合。

现在运行修改后的代码,返回的res就会是你预期的所有和为5、长度为3的有序列表了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:36:21