递归报错: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
相关产品推荐
相关产品推荐

