如何更改递归函数是否会更改结果?

时间:2016-08-22 21:52:44

标签: java recursion

我正在读一本名为“思考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”....我不明白它是如何工作的,有人可以尝试解释这个代码中发生的事情,使它以相反的方式计数吗?

2 个答案:

答案 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的订单。