我通过引用互联网上的一些代码使用递归调用编写了fizzbuzz代码。下面的代码可以正常工作,但是我无法完全理解执行该代码时的情况。
更具体地说,我不明白为什么首先显示1
。在main()
方法中,recurrence()
接收100
,因此感觉首先显示Buzz
(结果为100)。
我在IntelliJ上进行了调试,将断点放在recurrence(i - 1)
上,该方法先被调用100次,然后其余代码将在之后执行。我想知道recuurence
的结果存储在哪里。
public class FizzBuzz {
public static void main(String[] args) {
recurrence(100);
}
private static void recurrence(int i) {
if (i > 1) {
recurrence(i - 1);
}
if (i % 15 == 0 ) {
System.out.println("FizzBuzz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else
System.out.println(String.valueOf(i));
}
}
最佳答案
我不明白为什么首先显示1。在main()方法中,
因为使用100
的第一次调用使递归调用在该条件语句true
上循环:
if (i > 1) {
recurrence(i - 1);
}
recurrence(100)
,recurrence(99)
,recurrence(98)
,...直到recurrence(1)
都是如此。在
recurrence(1)
的递归调用(i=1
)处,情况有所不同,因为评估到true
的单个条件语句为:else
System.out.println(String.valueOf(i));
因此,首先打印
1
。我知道为什么先打印1。 1是重复的结果(1),
但努力了解其余结果的来源。一世
尝试考虑一下。
下一个输出与当前堆积的调用的“堆积”有关。
调用的“取消堆栈”以相反的顺序执行。
因此,您可以从上次调用到第一个调用取消堆叠。
recurrence(100)
,recurrence(99)
,recurrence(98)
,...,recurrence(2)
,recurrence(1)
被调用并堆叠然后从
recurrence(1)
,recurrence(2)
,...,recurrence(100)
。为了简化递归调用的工作方式,请记住方法调用是堆叠的(是否递归),并且堆栈是后进先出的结构。
现在回到解释,因为
recurrence(1)
到达以下语句:System.out.println(String.valueOf(i));
该方法返回,并且JVM继续先前的堆栈调用:
recurrence(2)
执行以下语句(先前的语句已被调用): if (i % 15 == 0) {
System.out.println("FizzBuzz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else
System.out.println(String.valueOf(i));
与
recurrence(1)
一样,评估为true
的单个条件语句为:else
System.out.println(String.valueOf(i));
因此,将打印
2
。继续对当前堆积的调用
recurrence(3)
,recurrence(4)
应用相同的逻辑,直到recurrence(100)
,并且都应该清除。关于java - 递归调用如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49572117/