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

Java递归疑问:未显式指令为何能打印栈弹出过程?

递归栈的执行逻辑解惑

问题描述

我从导师处获取了一段递归代码,理解栈的工作原理(先进后出、后进先出等),但困惑为何这段代码无需显式指令,就能打印栈弹出时的内容。例如,这段代码是如何在无对应命令的情况下展示栈弹出过程的?

我原以为代码执行到i=10时就会结束程序并销毁栈,但实际并非如此。

代码如下:

public class Recursion{

    public static void main(String [] args){
        printParam(1);
    }
    
    
    public static void printParam(int i) {
        System.out.println("i = " + i);
        
        if(i < 10) {
            printParam(i + 1);
        }
        
        System.out.println("i = " + i);
        
    }
}

解答

核心原因是递归调用完成后,程序会回到调用点继续执行剩余代码,并非直接销毁栈结束程序。

咱们一步步拆解执行流程:

  • 调用printParam(1),先执行第一个System.out.println("i = 1"),然后判断1<10成立,调用printParam(2)。
  • 进入printParam(2),同样先打印i=2,判断2<10成立,调用printParam(3)。
  • 这个过程一直重复,直到调用printParam(10):
    • 先打印i=10,然后判断10<10不成立,跳过递归调用。
    • 这时候开始执行第二个System.out.println("i=10"),执行完这个方法就结束,栈帧弹出。
  • 回到上一层调用点——也就是printParam(9)的递归调用之后,继续执行它的第二个System.out.println("i=9"),执行完弹出栈帧。
  • 以此类推,从i=9一直回到i=1,每个方法都会完成剩余的第二个打印语句,最终就出现了从1到10再从10到1的打印结果。

简单说,每个递归方法的代码并没有在递归调用后就结束,第二个println是栈弹出阶段的隐式执行逻辑,它本来就在方法里,只是要等递归调用完成后才会轮到执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:30:53