并行递归判断数字奇偶时输入5位以上数触发StackOverflowError求助
问题根因分析
- 你实现的是互递归逻辑,判断数值
n的奇偶性时,递归调用栈的深度和输入数值大小完全相等:比如输入10000,就要连续调用Odd→Even→Odd...共10000次,JVM默认的线程栈深度上限通常在8000~10000左右,输入5位及以上的数(≥10000)时自然会触发StackOverflowError - 用
long类型存储输入只是扩大了可存储的数值范围,完全不会改变递归调用的栈深度,和栈溢出没有关联
修复方案
方案1:直接用位运算实现(最高效,无递归)
奇偶性只和数值二进制的最后一位有关,直接用位运算判断即可,完全规避栈溢出风险:
static boolean Odd(long n) { return (n & 1) == 1; } static boolean Even(long d) { return (d & 1) == 0; }
方案2:优化递归逻辑,将栈深度降到O(log n)(保留递归写法)
如果必须保留递归实现,可以修改递归逻辑,每次将数值取模2,递归深度最高只有2层,再大的数值也不会栈溢出:
static boolean Odd(long n) { if (n < 0) n = -n; // 兼容负数场景,不需要可以删掉 if (n == 0) return false; if (n == 1) return true; return Odd(n % 2); } static boolean Even(long d) { if (d < 0) d = -d; // 兼容负数场景,不需要可以删掉 if (d == 0) return true; if (d == 1) return false; return Even(d % 2); }
方案3:调整JVM栈大小(不推荐)
可以通过JVM启动参数-Xss调大线程栈上限,比如设置-Xss20m可以支持20万左右的递归深度,但这个方案有严重的平台兼容性问题,实际生产场景不建议使用。
内容的提问来源于stack exchange,提问作者Baffo
相关产品推荐
相关产品推荐

