我通过引用互联网上的一些代码使用递归调用编写了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/

10-12 15:30