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)
将通过以下内容:
3*factorial(2)3*factorial(2),它计算factorial(2).2*factorial(1),因为它将返回到第三步,现在将返回总体回报3*2*factorial(1).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之间整数的乘积; 看到这个.负整数,浮点数和复数值的因子也被定义或者可以如先前的序列中的链接中所述进行插值,但是这些比简单的递归因子更复杂.
| 归档时间: |
|
| 查看次数: |
4830 次 |
| 最近记录: |