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

为何Java递归代码中x--触发StackOverflowError而--x正常?

为什么使用x--作为递归参数会触发StackOverflowError,而--x运行正常?

先看两段递归实现代码:

第一段(触发栈溢出):

private static int fib(int zero, int one, int x, int s) {
    if(x==0) return s;
    zero = one;
    one = s;
    s= zero + one;
    return fib(zero,one,x--,s);
 }

第二段(运行正常):

private static int fib(int zero, int one, int x, int s) { 
    if(x==0) return s;
    zero = one;
    one = s;
    s= zero + one;
    return fib(zero,one,--x,s);
}

核心原因:x--和--x的执行逻辑完全不同

  • x--是后置递减操作:它的执行顺序是「先把x当前的原始值传递给递归方法,再对x本身执行减1」。
    第一段代码里,每次递归调用时传入的x参数都是未减1的原始值,比如初始调用x=5,第一次递归传的还是5,之后x才变成4,但递归方法里的参数x依然是5。这样递归的终止条件x==0永远无法满足,递归会无限循环调用,最终耗尽JVM的栈内存,抛出StackOverflowError。
  • --x是前置递减操作:它的执行顺序是「先对x本身执行减1,再把减1后的新值传递给递归方法」。
    第二段代码里,每次递归传入的都是已经减1后的x值,x会从初始值逐步递减到0,触发x==0的终止条件,递归正常结束,不会出现栈溢出问题。

内容的提问来源于stack exchange,提问作者Arif Ahmed Arif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:04:54