Java含多返回语句的递归调用处理及输出差异疑问
递归返回值差异导致输出不同的原因
代码示例
recurse1 方法
public static int recurse1(int x) { //base condition if(x <= 0) return 1; int re = recurse1(x - 1); System.out.print("re "+re+", "); return re; }
recurse2 方法
public static int recurse2(int x) { //base condition if(x <= 0) return 1; int re = recurse2(x - 1); System.out.print("re "+re+", "); return x; }
核心差异:递归调用的返回值处理
两个方法的唯一区别是最后一行的返回值:
recurse1返回的是子调用的结果rerecurse2返回的是当前方法的参数x
这直接导致了每个递归层级中 re 的值不同,进而影响最终的打印输出。
逐层级模拟执行过程
模拟 recurse1(5) 的执行
递归调用会先逐层深入到基准条件(x=0),再逐层返回:
recurse1(0):触发基准条件,返回1给recurse1(1)的rerecurse1(1):打印re 1,,返回re(也就是1)给recurse1(2)的rerecurse1(2):打印re 1,,返回1给recurse1(3)的rerecurse1(3):打印re 1,,返回1给recurse1(4)的rerecurse1(4):打印re 1,,返回1给recurse1(5)的rerecurse1(5):打印re 1,,返回1
最终输出:re 1, re 1, re 1, re 1, re 1,
模拟 recurse2(5) 的执行
同样先深入到基准条件,再逐层返回,但返回值是当前的 x:
recurse2(0):触发基准条件,返回1给recurse2(1)的rerecurse2(1):打印re 1,,返回当前的x=1给recurse2(2)的rerecurse2(2):打印re 1,,返回当前的x=2给recurse2(3)的rerecurse2(3):打印re 2,,返回当前的x=3给recurse2(4)的rerecurse2(4):打印re 3,,返回当前的x=4给recurse2(5)的rerecurse2(5):打印re 4,,返回当前的x=5
最终输出:re 1, re 1, re 2, re 3, re 4,
总结
你预期输出一致是因为只关注了基准条件的返回值,但忽略了递归层级中当前方法的返回值会成为上层调用的 re 值。recurse1 每一层都传递基准值 1,而 recurse2 每一层返回当前的 x,导致上层的 re 逐层递增,最终输出出现差异。
内容的提问来源于stack exchange,提问作者Chinedu
相关产品推荐
相关产品推荐

