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

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 返回的是子调用的结果 re
  • recurse2 返回的是当前方法的参数 x

这直接导致了每个递归层级中 re 的值不同,进而影响最终的打印输出。

逐层级模拟执行过程

模拟 recurse1(5) 的执行

递归调用会先逐层深入到基准条件(x=0),再逐层返回:

  1. recurse1(0):触发基准条件,返回 1 给 recurse1(1) 的 re
  2. recurse1(1):打印 re 1, ,返回 re(也就是 1)给 recurse1(2) 的 re
  3. recurse1(2):打印 re 1, ,返回 1 给 recurse1(3) 的 re
  4. recurse1(3):打印 re 1, ,返回 1 给 recurse1(4) 的 re
  5. recurse1(4):打印 re 1, ,返回 1 给 recurse1(5) 的 re
  6. recurse1(5):打印 re 1, ,返回 1

最终输出:re 1, re 1, re 1, re 1, re 1,

模拟 recurse2(5) 的执行

同样先深入到基准条件,再逐层返回,但返回值是当前的 x:

  1. recurse2(0):触发基准条件,返回 1 给 recurse2(1) 的 re
  2. recurse2(1):打印 re 1, ,返回当前的 x=1 给 recurse2(2) 的 re
  3. recurse2(2):打印 re 1, ,返回当前的 x=2 给 recurse2(3) 的 re
  4. recurse2(3):打印 re 2, ,返回当前的 x=3 给 recurse2(4) 的 re
  5. recurse2(4):打印 re 3, ,返回当前的 x=4 给 recurse2(5) 的 re
  6. recurse2(5):打印 re 4, ,返回当前的 x=5

最终输出:re 1, re 1, re 2, re 3, re 4,

总结

你预期输出一致是因为只关注了基准条件的返回值,但忽略了递归层级中当前方法的返回值会成为上层调用的 re 值。recurse1 每一层都传递基准值 1,而 recurse2 每一层返回当前的 x,导致上层的 re 逐层递增,最终输出出现差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:07:24