为何递归终止后count变量值回升?Java递归行为解析
递归调用中局部变量的行为解析
这是因为每个sayHi函数的调用都会创建独立的局部变量count,它们存储在不同的栈帧里,并不是同一个变量被反复修改。递归终止后,程序会从最底层的调用逐层返回,执行每个调用中未完成的代码,这就导致了你看到的输出。
逐步骤拆解执行流程:
- 初始调用
sayHi(4):- 声明
count=4,打印4 - count不等于0,打印
hi!,接着调用sayHi(3)
- 声明
- 进入
sayHi(3):- 声明
count=3,打印3 - 打印
hi!,调用sayHi(2)
- 声明
- 进入
sayHi(2):- 声明
count=2,打印2 - 打印
hi!,调用sayHi(1)
- 声明
- 进入
sayHi(1):- 声明
count=1,打印1 - 打印
hi!,调用sayHi(0)
- 声明
- 进入
sayHi(0):- 声明
count=0,打印0 - 触发
return,直接结束当前调用,回到sayHi(1)中sayHi(count-1)语句的下一行
- 声明
- 返回
sayHi(1)继续执行:- 打印当前栈帧的
count=1 - 打印
Hello.,结束sayHi(1),回到sayHi(2)
- 打印当前栈帧的
- 返回
sayHi(2)继续执行:- 打印当前栈帧的
count=2 - 打印
Hello.,结束sayHi(2),回到sayHi(3)
- 打印当前栈帧的
- 返回
sayHi(3)继续执行:- 打印当前栈帧的
count=3 - 打印
Hello.,结束sayHi(3),回到sayHi(4)
- 打印当前栈帧的
- 返回
sayHi(4)继续执行:- 打印当前栈帧的
count=4 - 打印
Hello.,结束整个递归调用链
- 打印当前栈帧的
关键结论:
- 你看到的“count递增”,是逐层返回时,每个上层调用的局部
count值被打印出来,这些count本身就是不同的变量,不存在“恢复初始值”的说法 - 4次
Hello.对应初始调用sayHi(4)到sayHi(1)这4次调用,每个调用在完成递归子调用后,都会执行最后的System.out.println("Hello.")语句
原代码:
public class Main { public static void main(String[] args) { sayHi(4); } public static void sayHi(int i) { int count = i; System.out.println(count); if(count == 0) return; System.out.println("hi!"); sayHi(count - 1); System.out.println(count); System.out.println("Hello."); } }
运行输出:
4 hi! 3 hi! 2 hi! 1 hi! 0 1 Hello. 2 Hello. 3 Hello. 4 Hello.
内容的提问来源于stack exchange,提问作者Flint
相关产品推荐
相关产品推荐

