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

如何编写递归函数生成数字组合?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))

代码说明

  1. 移除了全局变量j,通过将结果列表result作为参数传递给helper函数,直接在满足条件时追加组合;
  2. 使用current.copy()是因为current是列表对象,直接追加会导致后续回溯操作修改已添加到result中的元素;
  3. 回溯逻辑保持不变:添加数字→递归生成子组合→移除数字,确保遍历所有可能的组合。

输出示例

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:05:32