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
相关产品推荐
相关产品推荐

