递归调用执行机制解析及递归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); } } }
核心原因:递归的“栈式执行”特性
递归调用的本质是先不断“深入”,直到触达终止条件,再反向“回溯”执行后续代码,这个过程可以类比成叠盘子:
- 当你调用
recurrence(100)时,方法先检查i≠0,于是先执行recurrence(99)——这时候recurrence(100)里的输出代码根本没机会跑,它得等recurrence(99)完全执行完才行。 - 同理,
recurrence(99)又会先执行recurrence(98),这个过程一直重复,直到调用recurrence(1)时,它会先调用recurrence(0)。 - 到了
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
相关产品推荐
相关产品推荐

