我正在读一本名为“思考Java:如何像计算机科学家那样思考”的书,我最近介绍了递归方法。
public static void countdown(int n)
if (n == 0) {
System.out.println("Blastoff!");
} else {
System.out.println(n);
countdown(n - 1);
}
}
这将是一个普通的递归方法,用于倒数到0,我理解发生了什么,但如果你在System.out.println之前做这样的递归调用
if (n == 0) {
System.out.println("Blastoff!");
} else {
countup(n - 1);
System.out.println(n);
}
它以反对的方式计算,所以如果我给这两个句子的论证都是第3个,那么第一个就是“3,2,1,Blastoff!”但是第二个1是“Blastoff,1,2,3”....我不明白它是如何工作的,有人可以尝试解释这个代码中发生的事情,使它以相反的方式计数吗?
答案 0 :(得分:1)
if (n == 0) {
System.out.println("Blastoff!");
} else {
countup(n - 1);
System.out.println(n);
}
这只是因为您将countdown(n-1)
放在system.out.println(n);
当你放在System.out.println(n)
之前时,该方法将继续从countdown(n-1)
调用,直到它结束调用,光标转到下一个system.out.println。
所以,这就是递归的工作方式,就像一个自包含的方法, 一个方法调用另一个方法......最后是最后一个方法 完成后,它返回到last-1,然后是last-2和last-n
在您的情况下,首先转到countdown(n-1)
,然后继续使用相同的方法,直至达到n==0
。在n==0
后,所有方法调用都会返回到System.out.println(n);
答案 1 :(得分:0)
在打印前调用countup(n - 1)
时,打印无法访问,直到递归停止为止。在递归期间,数字被推入堆栈。递归完成后,所有数字都从堆栈中弹出。
我们知道,堆栈是 LIFO(后进先出)。因为它按顺序推入堆栈3,2,1。这就是为什么当数字从堆栈弹出时,它们按顺序1,2,3。
但是在第一种方法中,打印是在递归调用之前完成的。这就是为什么你得到3,2,1的订单。