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

JavaScript递归函数遇RangeError:调用栈溢出问题求解决方案

解决超大数字数位和计算的栈溢出问题

你的代码出现栈溢出是因为两个递归函数在k值很大时调用次数直接拉满:

  • getTheP递归k次来重复构建数组,当k=10000时,递归深度远超JavaScript调用栈的默认上限
  • recursiveSum用递归计算数位和,同样存在栈溢出风险

其实完全不用真的把数组重复k次,利用数位和的数学性质就能大幅简化计算:

  1. 原数字n的各位之和为s,重复k次后的总数位和就是s * k
  2. 求最终的超级数字(直到变成一位数),本质是求数字根,规则是:
    • 若结果为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:10:34