繁体   English   中英

Java递归误解

[英]Java Recursivity misunderstanding

我不明白这段代码,为什么要计数。 如果我通过递归调用更改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);        

         } 
   }

因此,如果n!= 0,则程序在“ else”块中运行代码,其中是对方法countdown(n-1)的另一次调用。 例如,如果您将n = 3,则只要n> 0,此代码就会一直运行。因此,基本上运行的方法自己运行,如下所示:

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

您应将条件“ n == 0”更改为“ n <= 0”。 因为如果传递负值,它将不会停止,并且您可能会看到负数。

让我们说如果您通过了n = -3。 那么它将继续打印-3,-4 ...等。

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

它的确计数。

让我们看一下实际发生的情况:每个countdown调用都会首先调用自己,甚至没有将任何内容写入System.out

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

  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. 将打印n ,其值为1。
  9. 方法退出,返回到步骤1表示的方法。
  10. 将打印n ,其值为2。
  11. 方法退出

请注意,每个方法调用都有其自己的局部变量,例如n 因此输出为:

Blastoff!
1
2

如预期的那样。 您会发现,按照书中所说,该方法在将某些内容打印到sysout之前会先调用自身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM