[英]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
。
countdown(2)
被称为 n == 2
,因此执行else
块 countdown(1)
被称为 n == 1
,因此执行else
块 countdown(0)
被称为 n == 0
因此if条件为true,因此“ Blastoff!” 打印 n
,其值为1。 n
,其值为2。 请注意,每个方法调用都有其自己的局部变量,例如n
。 因此输出为:
Blastoff!
1
2
如预期的那样。 您会发现,按照书中所说,该方法在将某些内容打印到sysout之前会先调用自身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.