递归实现的回文数判断函数无响应,请求排查错误
排查递归函数
sameOrPalindrome的无限递归问题 你遇到的无响应问题本质是无限递归,核心原因是你的代码逻辑误解了需求——它会一直递归寻找下一个回文数,而不是只检查原数递增1后的两次(也就是num+1和num+2)。
问题拆解
咱们来看看输入1122时发生了什么:
- 1122不是回文数,代码执行
num++得到1123,然后递归调用sameOrPalindrome(1123); - 1123也不是回文数,再次
num++得到1124,继续递归; - 这个过程会持续到找到回文数(比如1221),中间要递归近100次,不仅效率极低,还会因为递归深度过大导致环境无响应,甚至栈溢出。
而你的需求明确是:只检查原数+1和原数+2这两个数,任意一个是回文就返回1,否则返回0,完全不需要一直往后找。
修复方案
咱们可以把回文判断逻辑抽成一个独立的辅助函数,然后直接按需求依次检查即可,不需要递归:
// 辅助函数:判断一个数是否为回文数 function isPalindrome(num) { const numStr = num.toString(); return numStr === numStr.split('').reverse().join(''); } function sameOrPalindrome(num) { // 检查原数是否是回文 if (isPalindrome(num)) { return 2; } // 检查原数+1 if (isPalindrome(num + 1)) { return 1; } // 检查原数+2 if (isPalindrome(num + 2)) { return 1; } // 都不符合,返回0 return 0; } // 测试用例 console.log("11211", sameOrPalindrome(11211)); // 输出 2 console.log("1122", sameOrPalindrome(1122)); // 输出 0(1123、1124都不是回文) console.log("1233", sameOrPalindrome(1233)); // 输出 0 console.log("1220", sameOrPalindrome(1220)); // 输出 1(1220+1=1221是回文)
修复后的优势
- 逻辑完全匹配需求,不会出现无限递归;
- 代码可读性更强,辅助函数职责单一,主函数流程清晰;
- 性能大幅提升,避免了不必要的递归调用。
内容的提问来源于stack exchange,提问作者riyad303030
相关产品推荐
相关产品推荐

