为何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
相关产品推荐
相关产品推荐

