我不理解这段代码,为什么它会起作用。如果我使用递归调用更改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);
}
}
答案 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
。
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打印之前调用自己。