JavaScript递归函数遇RangeError:调用栈溢出问题求解决方案
解决超大数字数位和计算的栈溢出问题
你的代码出现栈溢出是因为两个递归函数在k值很大时调用次数直接拉满:
getTheP递归k次来重复构建数组,当k=10000时,递归深度远超JavaScript调用栈的默认上限recursiveSum用递归计算数位和,同样存在栈溢出风险
其实完全不用真的把数组重复k次,利用数位和的数学性质就能大幅简化计算:
- 原数字
n的各位之和为s,重复k次后的总数位和就是s * k - 求最终的超级数字(直到变成一位数),本质是求数字根,规则是:
- 若结果为0,返回0
- 若结果是9的倍数,返回9
- 否则返回结果对9取余
直接按这个逻辑重写代码,完全避免递归,多大的k都能处理:
function superDigit(n, k) { // 计算原数字n的数位和 const digitSum = [...n].reduce((acc, curr) => acc + Number(curr), 0); // 计算重复k次后的总数位和 let total = digitSum * k; // 循环求数字根,彻底避开递归 while (total >= 10) { total = [...total.toString()].reduce((acc, curr) => acc + Number(curr), 0); } console.log(total); return total; } // 测试调用 superDigit('4757362', 10000);
如果想用数学公式直接求数字根,效率会更高:
function superDigit(n, k) { const digitSum = [...n].reduce((acc, curr) => acc + Number(curr), 0); const total = digitSum * k; if (total === 0) return 0; const result = total % 9; console.log(result === 0 ? 9 : result); return result === 0 ? 9 : result; }
原代码递归踩坑的原因
JavaScript的调用栈深度有限(通常在几千到一万左右),当你递归10000次时,栈里会堆积10000个未执行完的函数调用,直接超出浏览器或Node.js的栈上限,触发栈溢出错误。用循环或者数学公式替代递归,就能彻底解决这个问题。
内容的提问来源于stack exchange,提问作者Lucas Junqueira
相关产品推荐
相关产品推荐

