如何编写递归函数生成数字组合?n=3时遇索引错误求助
解决递归生成数字组合的索引越界问题
错误原因
你的代码触发IndexError的核心问题是全局变量j没有在每次调用generate时重置:
- 第一次调用
generate(2)后,j的值会变成4(对应2²=4个组合); - 接着调用
generate(3)时,j的初始值仍是4,而非0; - 当生成第24个3位数组合时,
j会增加到27,而lol的长度是3³=27(索引范围0-26),此时访问lol[27]就会触发索引越界。
另外,原代码预先创建长度为n**n的空列表属于冗余操作,既浪费空间,又容易引发索引相关问题。
修复方案
去掉全局变量,改用动态添加组合的方式实现递归,既避免全局变量的副作用,也无需预先分配列表长度。
修复后的代码
def generate(n): result = [] helper(n, [], result) return result def helper(n, current, result): # 当当前组合长度等于n时,添加到结果列表(注意复制current,避免后续回溯修改已添加的元素) if len(current) == n: result.append(current.copy()) return # 遍历1到n的数字,递归生成所有可能的组合 for num in range(1, n+1): current.append(num) helper(n, current, result) current.pop() # 回溯,移除当前数字以尝试下一个选项 # 测试 print(generate(2)) print(generate(3))
代码说明
- 移除了全局变量
j,通过将结果列表result作为参数传递给helper函数,直接在满足条件时追加组合; - 使用
current.copy()是因为current是列表对象,直接追加会导致后续回溯操作修改已添加到result中的元素; - 回溯逻辑保持不变:添加数字→递归生成子组合→移除数字,确保遍历所有可能的组合。
输出示例
generate(2)输出:[[1, 1], [1, 2], [2, 1], [2, 2]]generate(3)输出:包含27个3元素组合的列表,如[[1,1,1], [1,1,2], ..., [3,3,3]]
内容的提问来源于stack exchange,提问作者Deepak Singh Parihar
相关产品推荐
相关产品推荐

