Java Recursivity误解

时间:2018-03-26 12:05:30

标签: java

我不理解这段代码,为什么它会起作用。如果我使用递归调用更改print语句中的顺序它对我有意义,但因为它是为什么它正在计数。在书中它说“System.out.println恰好在每次递归调用返回之前发生。因此,它会向上计数而不是向下计数。”我不理解它。感谢您的帮助。

    public static void countdown(int n)
    {
         if (n == 0) 
         {        
              System.out.println("Blastoff!");    
         } 
         else 
         {
               countdown(n - 1); 
               System.out.println(n);        

         } 
   }

3 个答案:

答案 0 :(得分:2)

所以,如果n!= 0,你的程序在“else”块中运行代码,其中是另一个方法倒计时调用(n-1)。例如,如果你把n = 3,只要n>这个代码就会运行。所以,基本运行方法运行自己,看起来像这样:

倒计时(3)呼叫方法倒计时(2),然后倒计时(2)呼叫倒计时(1)。只要n大于0,就会发生。如果n == 0,它将打印您的消息。

答案 1 :(得分:1)

你应该改变条件&n; = = 0'到' n< = 0'。因为如果你传递负值,那么它就不会停止,你可能会看到负数。

如果你通过n = -3,我们会说。那么它会继续打印-3,-4 ......等。

答案 2 :(得分:1)

countdown(n - 1);
System.out.println(n);

确实很重要。

让我们来看看实际发生的情况:每个countdown调用都会先调用自身,甚至在将任何内容写入System.out之前。

在以下示例中,假设我以countdown作为参数调用2

  1. countdown(2)被称为
  2. 在此方法调用中n == 2,因此执行else
  3. countdown(1)被称为
  4. 在此方法调用中n == 1,因此执行else
  5. countdown(0)被称为
  6. 在此方法调用中,n == 0因此if条件为true,因此打印“Blastoff!”
  7. 此方法退出,返回步骤3表示的方法。
  8. 打印
  9. n,其值为1.
  10. 该方法退出,返回步骤1表示的方法。
  11. 打印
  12. n,其值为2.
  13. 方法退出
  14. 请注意,每个方法调用都有自己的局部变量,如n。所以输出是:

    Blastoff!
    1
    2
    

    正如所料。你可以看到,正如本书所说的那样,该方法在向sysout打印之前调用自己。