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

请求协助追踪递归打印代码执行流程以理解递归机制

没问题!咱们一步步拆解printStuff(2)的执行流程,把递归的每一步都理清楚,这样你就能直观看到递归的调用和返回逻辑了。

首先先修正代码里的两处小笔误(不然编译会报错):

  1. 方法参数int Level改为int level(保持变量名大小写一致)
  2. else块最后一行System.out.print("]")添加分号,修正后完整代码如下:
public static void printStuff(int level) { 
    if (level == 0) { 
        System.out.print("*"); 
    } else { 
        System.out.print("["); 
        printStuff(level-1); 
        System.out.print(","); 
        printStuff(level-1); 
        System.out.print("]"); 
    } 
} 
public static void main (String [] args) { 
    printStuff(2); 
}

现在咱们按调用栈的顺序,一步步追踪执行过程:

执行流程拆解

1. 启动:调用printStuff(2)

  • 进入方法,level=2,不满足level==0,进入else块
  • 执行System.out.print("["),控制台输出:[
  • 接下来调用printStuff(1),暂停当前printStuff(2)的执行,进入子方法

2. 第一次进入printStuff(1)

  • 进入方法,level=1,不满足level==0,进入else块
  • 执行System.out.print("["),控制台输出变为:[[
  • 调用printStuff(0),暂停当前printStuff(1)的执行,进入子方法

3. 第一次触发Base Case:printStuff(0)

  • 进入方法,level=0,满足条件,执行System.out.print("*"),控制台输出变为:[[*
  • 方法执行完毕,返回到上一层的printStuff(1),继续执行暂停的代码

4. 回到printStuff(1)继续执行

  • 执行System.out.print(","),控制台输出变为:[[*,
  • 再次调用printStuff(0),暂停当前printStuff(1)的执行,进入子方法

5. 第二次触发Base Case:printStuff(0)

  • 进入方法,level=0,执行System.out.print("*"),控制台输出变为:[[*,*
  • 方法执行完毕,返回到上一层的printStuff(1),继续执行暂停的代码

6. 完成第一次printStuff(1)

  • 执行System.out.print("]"),控制台输出变为:[[*,*]
  • printStuff(1)执行完毕,返回到最开始的printStuff(2),继续执行暂停的代码

7. 回到printStuff(2)继续执行

  • 执行System.out.print(","),控制台输出变为:[[*,*],
  • 调用printStuff(1),暂停当前printStuff(2)的执行,进入子方法

8. 第二次进入printStuff(1)

  • 进入方法,level=1,进入else块
  • 执行System.out.print("["),控制台输出变为:[[*,*], [
  • 调用printStuff(0),暂停当前printStuff(1)的执行,进入子方法

9. 第三次触发Base Case:printStuff(0)

  • 执行System.out.print("*"),控制台输出变为:[[*,*], [*
  • 方法执行完毕,返回到上一层的printStuff(1),继续执行暂停的代码

10. 回到第二次printStuff(1)继续执行

  • 执行System.out.print(","),控制台输出变为:[[*,*], [*,
  • 再次调用printStuff(0),暂停当前printStuff(1)的执行,进入子方法

11. 第四次触发Base Case:printStuff(0)

  • 执行System.out.print("*"),控制台输出变为:[[*,*], [*,*
  • 方法执行完毕,返回到上一层的printStuff(1),继续执行暂停的代码

12. 完成第二次printStuff(1)

  • 执行System.out.print("]"),控制台输出变为:[[*,*], [*,*]]
  • printStuff(1)执行完毕,返回到printStuff(2)

13. 完成printStuff(2)

  • 执行System.out.print("]"),控制台最终输出:[[*,*], [*,*]]
  • printStuff(2)执行完毕,程序结束
核心逻辑总结

递归的本质就是先逐层深入到最底层的终止条件(Base Case),再逐层返回执行剩余代码,就像一层层打开嵌套的盒子:先打开最外层,再打开里面的,直到摸到最里面的物品,然后再一层层把盒子关上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:17:48