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

为何递归终止后count变量值回升?Java递归行为解析

递归调用中局部变量的行为解析

这是因为每个sayHi函数的调用都会创建独立的局部变量count,它们存储在不同的栈帧里,并不是同一个变量被反复修改。递归终止后,程序会从最底层的调用逐层返回,执行每个调用中未完成的代码,这就导致了你看到的输出。

逐步骤拆解执行流程:

  1. 初始调用sayHi(4):
    • 声明count=4,打印4
    • count不等于0,打印hi!,接着调用sayHi(3)
  2. 进入sayHi(3):
    • 声明count=3,打印3
    • 打印hi!,调用sayHi(2)
  3. 进入sayHi(2):
    • 声明count=2,打印2
    • 打印hi!,调用sayHi(1)
  4. 进入sayHi(1):
    • 声明count=1,打印1
    • 打印hi!,调用sayHi(0)
  5. 进入sayHi(0):
    • 声明count=0,打印0
    • 触发return,直接结束当前调用,回到sayHi(1)中sayHi(count-1)语句的下一行
  6. 返回sayHi(1)继续执行:
    • 打印当前栈帧的count=1
    • 打印Hello.,结束sayHi(1),回到sayHi(2)
  7. 返回sayHi(2)继续执行:
    • 打印当前栈帧的count=2
    • 打印Hello.,结束sayHi(2),回到sayHi(3)
  8. 返回sayHi(3)继续执行:
    • 打印当前栈帧的count=3
    • 打印Hello.,结束sayHi(3),回到sayHi(4)
  9. 返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:06:16