递归实现回文数查找遇大数字栈溢出,如何修复以支持更大数值?
修复回文数查找函数的栈溢出与大数字精度问题
你的代码出现调用栈溢出,是因为递归函数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
相关产品推荐
相关产品推荐

