解释析因方法中的递归

use*_*467 1 java methods factorial

我是计算机科学和学习复习方法的新手.可以简单地解释一下这种方法.

 import java.util.Scanner;

public class factorial {

    public static void main(String args[]) {

        Scanner scan = new Scanner(System.in);

        int n = scan.nextInt();

        System.out.print(factorial(n));

    }

    private static long factorial(int n) {      // HERE I DON'T UNDERSTAND HOW 
                                               //  THE MACHINE NOWS WHAT IS "factorial"
        if (n == 1)
            return 1;
        else
            return n * factorial(n - 1);               // ??
    }

}
Run Code Online (Sandbox Code Playgroud)

Far*_*Joe 10

机器不知道是什么factorial,那里的代码告诉它如何计算阶乘.它通过说"你给我的号码是1吗?"来做到这一点.并且直到它,返回函数返回的次数n - 1,基本上这将级联到阶乘的计算中.

如果你举一个例子,这很容易看出:

3! = 3*2*1
Run Code Online (Sandbox Code Playgroud)

要么

3! = 3*2!
Run Code Online (Sandbox Code Playgroud)

返回方法在表单中给出的是:

factorial(n) = n * factorial(n-1)
Run Code Online (Sandbox Code Playgroud)

该计划给出:

factorial(3);
Run Code Online (Sandbox Code Playgroud)

将通过以下内容:

  1. 3等于1吗?
  2. 事实并非如此 3*factorial(2)
  3. 为了获得3*factorial(2),它计算factorial(2).
  4. 现在检查:2等于1?
  5. 它不会返回2*factorial(1),因为它将返回到第三步,现在将返回总体回报3*2*factorial(1).
  6. 接下来程序检查:1等于1?
  7. 它返回1.
  8. 这将返回到我们在第五步中的调用:2*factorial(1)成为2*1 = 2,返回到第3步的调用,我们的第一个调用,给我们3*2 = 6,这是函数将返回的整体.

这种方法可以做一些调整.想象一下你提供给它0?它会在无限递归时不断调用阶乘方法,因为序列0,-1,-2,-3,-4,...永远不会到达1.一个更好的方法可能如下所示:

private static long factorial(int n) {

    if (n == 1 || n == 0) {
        return 1;
    } else if (n < 0) {  // factorials are not defined below 0, they can be interpolated
        return null;     // though, see note below
    } else {
        return n * factorial(n - 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数现在将覆盖整个整数范围的阶乘,使用空数解为负数.因子n的定义定义为1和n之间整数的乘积; 看到这个.负整数,浮点数和复数值的因子也被定义或者可以如先前的序列中的链接中所述进行插值,但是这些比简单的递归因子更复杂.