C#回文判断递归引发Stack Overflow Exception如何解决?
解决递归回文判断的栈溢出问题
核心结论:别搞异常处理,直接优化逻辑
StackOverflowException是CLR层面的致命异常,根本无法通过try/catch捕获处理,所以添加异常处理完全是白费功夫。问题出在递归的调用栈深度上——你的递归方法会为每个子字符串创建一个栈帧,当遇到长字符串时,调用栈的深度会超过CLR的栈容量限制,直接触发溢出。
最优方案:换成迭代实现
用双指针迭代的方式判断回文,不需要调用栈,既不会栈溢出,还能避免递归里Substring创建大量临时字符串的内存浪费,效率更高。
修改后的回文判断方法:
private static bool IsPalindrome(string s) { if (string.IsNullOrWhiteSpace(s)) return false; int left = 0; int right = s.Length - 1; while (left < right) { if (s[left] != s[right]) return false; left++; right--; } return true; }
原递归代码的其他问题
- 内存浪费:每次递归调用
Substring都会生成新字符串实例,短字符串还好,长字符串会产生大量垃圾对象。 - 递归深度受限:递归次数等于字符串长度的一半,只要字符串长度超过栈能容纳的深度(通常几千级就会溢出),必然崩掉。
额外的小优化
- 把
Main里的for循环改成foreach,代码更简洁:
foreach (string line in File.ReadAllLines("UKACD17.TXT")) { if (IsPalindrome(line)) { Console.WriteLine(line); c++; } }
- 如果你的文本文件特别大,用
File.ReadLines代替File.ReadAllLines,前者是流式读取,不会一次性把所有内容加载到内存,更省资源:
foreach (string line in File.ReadLines("UKACD17.TXT")) { if (IsPalindrome(line)) { Console.WriteLine(line); c++; } }
内容的提问来源于stack exchange,提问作者Popwarfirm2
相关产品推荐
相关产品推荐

