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

递归报错:RangeError: Maximum call stack size exceeded问题求助

问题分析与修复

核心错误原因

你遇到的栈溢出是因为递归时传入的是同一个重复数字:当生成的num已经在idNum数组里时,你直接递归调用checkIfGeneratedIdExists(num),相当于无限重复检查同一个存在的数,永远跳不出else分支,最终撑爆调用栈。

另外代码还有几个逻辑漏洞:

  • 生成随机数后根本没调用检查函数
  • 注释写着"Number should always be < 0",但实际生成的是0-19的正整数,逻辑矛盾
  • 当num === 0时直接return,没有返回可用ID,后续拿不到有效值
  • 没处理idNum已经包含所有0-19数字的极端情况,还是会无限递归

修复后的代码

const idNum = terms.map((item) => parseInt(item.id));

// 生成0-19之间的随机数
const generateRandomNum = () => Math.trunc(Math.random() * 20);

const getUniqueId = () => {
  // 先检查数组是否装满所有可能数字,避免无限递归
  if (idNum.length >= 20) {
    throw new Error("所有可用ID已被占用");
  }
  
  const num = generateRandomNum();
  if (!idNum.includes(num)) {
    idNum.push(num);
    return num;
  }
  // 数字存在就递归调用,生成新随机数重新检查
  return getUniqueId();
};

// 调用函数获取唯一ID
const generatedNumber = getUniqueId();

关键修改点

  • 把随机数生成抽成单独函数,每次递归都生成新的随机数,不再复用旧值
  • 增加数组满员判断,避免极端场景下的无限递归
  • 去掉无效的num === 0判断(如果确实要排除0,把generateRandomNum改成Math.trunc(Math.random() * 19) + 1,生成1-19的数即可)
  • 确保每次递归都会生成新随机数,直到找到未存在的ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:05:01