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

递归实现回文数查找遇大数字栈溢出,如何修复以支持更大数值?

修复回文数查找函数的栈溢出与大数字精度问题

你的代码出现调用栈溢出,是因为递归函数iterNum在处理需要多步迭代的大数字时,调用栈深度超过了JavaScript引擎的限制(通常在10000左右)。另外,超大数字直接用Number类型处理会丢失精度,因为JS的Number只能精确表示到2^53-1,超出后会出现精度偏差,导致回文判断错误。

修复方案:递归改循环 + 字符串处理大数字

把递归逻辑替换成while循环,彻底避免调用栈溢出;同时用字符串来处理数字的反转和加法,保证大数字的精度。

修改后的代码如下:

(function () {
  // 字符串加法函数:处理大数字相加,避免Number精度丢失
  function addStrings(a, b) {
    let result = [];
    let carry = 0;
    let i = a.length - 1;
    let j = b.length - 1;

    while (i >= 0 || j >= 0 || carry > 0) {
      const digitA = i >= 0 ? parseInt(a[i], 10) : 0;
      const digitB = j >= 0 ? parseInt(b[j], 10) : 0;
      const sum = digitA + digitB + carry;
      carry = Math.floor(sum / 10);
      result.push(sum % 10);
      i--;
      j--;
    }

    return result.reverse().join('');
  }

  // 判断字符串是否为回文
  function isPalindromeStr(str) {
    let left = 0;
    let right = str.length - 1;
    while (left < right) {
      if (str[left] !== str[right]) {
        return false;
      }
      left++;
      right--;
    }
    return true;
  }

  function checkPalindrome(num) {
    let currentNum = num.toString(); // 转成字符串处理
    const palindromeResult = {
      result: 0,
      steps: 0,
    };

    while (!isPalindromeStr(currentNum)) {
      // 反转字符串
      const reversedNum = currentNum.split('').reverse().join('');
      // 字符串相加
      currentNum = addStrings(currentNum, reversedNum);
      palindromeResult.steps++;
    }

    palindromeResult.result = BigInt(currentNum); // 用BigInt存储结果,方便后续数值操作
    return palindromeResult;
  }

  console.log(checkPalindrome(213132424143132131));
})();

关键修改说明

  • 递归改循环:用while循环代替递归调用,不会占用调用栈,无论需要多少步迭代都不会出现栈溢出。
  • 字符串加法:自定义addStrings函数处理大数字相加,避免Number类型的精度丢失问题。
  • 字符串回文判断:直接对字符串进行首尾比对,比转成数字再判断更高效且精准。
  • BigInt存储结果:最终结果用BigInt类型存储,保留完整的大数字精度,方便后续的数值操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:02:50