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

递归调用执行机制解析及递归FizzBuzz输出顺序疑问

搞懂递归版FizzBuzz的执行顺序:为什么先输出1而不是100?

嘿,我太懂你这种困惑了——递归的“反向执行感”第一次接触真的容易绕懵!咱们一步步拆解清楚,你就明白为啥程序先输出1了。

首先先还原一下你写的递归FizzBuzz核心逻辑(应该和下面这段差不多):

public class FizzBuzzRecursive {
    public static void main(String[] args) {
        recurrence(100);
    }

    private static void recurrence(int i) {
        // 终止条件:当i为0时停止递归
        if (i == 0) {
            return;
        }
        // 先调用下一层递归
        recurrence(i - 1);
        // 递归返回后才执行的输出逻辑
        if (i % 15 == 0) {
            System.out.println("FizzBuzz");
        } else if (i % 3 == 0) {
            System.out.println("Fizz");
        } else if (i % 5 == 0) {
            System.out.println("Buzz");
        } else {
            System.out.println(i);
        }
    }
}

核心原因:递归的“栈式执行”特性

递归调用的本质是先不断“深入”,直到触达终止条件,再反向“回溯”执行后续代码,这个过程可以类比成叠盘子:

  1. 当你调用recurrence(100)时,方法先检查i≠0,于是先执行recurrence(99)——这时候recurrence(100)里的输出代码根本没机会跑,它得等recurrence(99)完全执行完才行。
  2. 同理,recurrence(99)又会先执行recurrence(98),这个过程一直重复,直到调用recurrence(1)时,它会先调用recurrence(0)。
  3. 到了recurrence(0),触发终止条件return,这时候递归的“深入”阶段结束,开始“回溯”:
    • 回到recurrence(1),现在终于可以执行它的输出代码,输出1;
    • 然后回到recurrence(2),执行输出2;
    • 接着是recurrence(3)输出Fizz……
    • 一直回溯到最开始的recurrence(100),最后输出Buzz。

对应你调试的发现

你在recurrence(i - 1)设断点时,看到这个方法被连续调用100次,就是递归在“深入”阶段不断压栈的过程——从100到1,每一次都先触发下一层调用,直到碰到终止条件才停下来。之后才开始逐个弹出栈里的调用,执行输出逻辑。

简单总结:递归里先写的调用语句会优先执行到底,后续代码要等所有递归调用返回后才会按回溯顺序执行,所以最终输出是从1到100,而不是你直觉里的100到1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:12:23