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

递归代码疑问:传入参数5时最后一行输出为何是升序而非降序?

递归执行流程解析:为什么最后输出是升序的No.1到No.5?

先把你的代码贴出来方便分析:

public void rec(int val) { 
    if(val == 0) return; 
    for(int i = 0; i < val ; i++) 
        System.out.print("*"); 
    System.out.println("#"); 
    rec(val - 1); 
    System.out.println("No." + val); 
}

这个问题的核心是理解递归的两个关键阶段:递推(向下调用)和回溯(向上返回)。咱们一步步走一遍传入val=5时的执行过程,就能明白原因了:

递推阶段(从val=5到val=0)

  1. 调用rec(5):先执行循环打印*****#,接着调用rec(4)
  2. 调用rec(4):打印****#,接着调用rec(3)
  3. 调用rec(3):打印***#,接着调用rec(2)
  4. 调用rec(2):打印**#,接着调用rec(1)
  5. 调用rec(1):打印*#,接着调用rec(0)
  6. 调用rec(0):触发if(val == 0) return;,直接返回,递推阶段结束。

回溯阶段(从val=1回到val=5)

现在开始从最底层的递归调用往回走,执行每个递归调用中rec(val-1)之后的代码:

  1. 从rec(0)返回到rec(1):执行System.out.println("No." + 1); → 输出No.1
  2. 从rec(1)返回到rec(2):执行System.out.println("No." + 2); → 输出No.2
  3. 从rec(2)返回到rec(3):执行System.out.println("No." + 3); → 输出No.3
  4. 从rec(3)返回到rec(4):执行System.out.println("No." + 4); → 输出No.4
  5. 从rec(4)返回到rec(5):执行System.out.println("No." + 5); → 输出No.5

所以你看到的最后几行是No.1到No.5的升序排列,本质是因为回溯是从最小的val开始往上执行后续代码的。如果想要得到降序的输出,只需要把System.out.println("No." + val);移到rec(val-1);之前——这样就会在递推阶段先打印当前val的序号,再调用下一层递归,最终输出就是降序的No.5到No.1了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:33:58