如果'return'确实结束了一个方法,那么这个阶乘递归是如何工作的?

时间:2016-12-17 19:07:01

标签: java recursion

我是编程的新手,我看到了一本书中的递归示例,让我感到困惑。

如果return确实结束了方法执行,那该怎么办?

public class Recursion{

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    System.out.print("Type a number -> ");
    int n = s.nextInt();
    n = factorial(n);
    System.out.println("FACTORIAL : " + n);
}

static private int factorial(int n) {
    if (n == 0) {
        System.out.println("-- REACHED ZERO! " + n);
        return 1; // even if the method reach this condition, it doesn't stop the method, but why?
    }
    System.out.println("N: " + n);
    int r = n * factorial(n - 1);
    System.out.println("R: " + r); // even with the 'return 1;' line, this will print. But how does that works?
    return r;
}

当我运行代码时,结果如预期:

    Type a number -> 5
    N: 5
    N: 4
    N: 3
    N: 2
    N: 1
    -- REACHED ZERO! 0
    R: 1
    R: 2
    R: 6
    R: 24
    R: 120
    FACTORIAL : 120

3 个答案:

答案 0 :(得分:0)

返回是所有方法的结束,因为它返回最终值。递归意味着某些东西会一直发生,直到达到零为止,一旦它完成,你将在方法中返回1,这意味着它在某一点停止执行。希望这澄清了任何事情,如果是这样接受答案请:)

答案 1 :(得分:0)

考虑在阶乘函数的第5行发生的事情 - 对System.out.println()的调用。当该方法返回时,会发生什么?好吧,程序流程继续到下一行,这是对factorial的调用。因此,当该函数返回时,该操作与调用println之后发生的操作相同 - flow继续执行下一个语句,这是对println的另一个调用。

答案 2 :(得分:0)

return语句确实结束了当前方法的执行。使用递归,您将多次调用该方法,因此返回只会结束同一方法的多次执行之一。