Python程序生成n=3的正整数和所有唯一表示的逻辑错误排查
程序逻辑错误分析
核心错误原因
这段代码实际输出全为空列表的根本问题是添加列表引用而非状态副本到结果集合:
- 执行
res.append(a)时,并未将当前a的内容复制存入res,而是把a这个列表对象的引用添加到了结果中。 - 回溯过程中,后续的
a.pop()会持续修改该引用指向的列表内容。当整个回溯流程结束后,a被完全清空,导致res中所有元素都指向同一个空列表,最终输出[ [], [], [], [] ]。
修正方案
在将a加入结果集时,添加其当前状态的副本,而非原列表的引用。可以用a.copy()或list(a)实现:
def fun(): res = [] a = [] def backtracking(n): if n == 0: res.append(a.copy()) # 替换为添加当前状态的副本 return if n < 0: return for i in range(1, n+1): a.append(i) backtracking(n - i) a.pop() backtracking(3) return res print(fun()) # 输出符合预期: [[1, 1, 1], [1, 2], [2, 1], [3]]
额外说明(可选)
如果需求是生成不考虑顺序的唯一拆分(即[1,2]和[2,1]视为同一种,预期输出应为[[1,1,1],[1,2],[3]]),还需在循环中限制i的起始值,避免生成顺序不同的重复拆分,修改后的循环逻辑如下:
start = a[-1] if a else 1 for i in range(start, n+1):
内容的提问来源于stack exchange,提问作者AKSHAY KP
相关产品推荐
相关产品推荐

