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

并行递归判断数字奇偶时输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:03