我正在从一本书中学习Java,并使用一个因子示例来讨论有关递归的章节。
//A simple example of recursion
package tutorials;
class Factorial {
// this is a recursive method
int fact (int n) {
int result;
if(n==1) return 1;
result = fact(n - 1) * n;
return result;
}
}
class Recursion {
public static void main(String args[]) {
Factorial f = new Factorial();
System.out.println("Factorial of 3 is " + f.fact(3));
System.out.println("Factorial of 4 is " + f.fact(4));
System.out.println("Factorial of 5 is " + f.fact(5));
}
}
这段代码给出的结果是"因子3是6"和" 4的因子是24"
我不明白的是,课程因素中发生的事情以及为什么* n不会立即计算出来。这本书没有很好地解释这个,所以我想我会问任何有经验的程序员帮忙。
答案 0 :(得分:2)
如果你调用fact(5)
,它的工作原理如下:
fact(5)
5*fact(4)
4*fact(3)
3*fact(2)
2*fact(1)
2*1=2 //(since if n==1, 1 is returned directly
result=2
result=3*2
result=4*3*2
result=5*4*3*2
result=120
递归只是意味着你在自己内部调用一个方法,通常是在操纵参数以适应你的最终结果之后(在本例中为n - 1
)。您还要确保定义终端条件(在这种情况下为n==1
)。在内部,变量被推送到堆栈以便为每次调用记住,但这可能是另一天的讨论
答案 1 :(得分:-1)
数字n的阶乘定义为: n *(n - 1)*(n - 2)* ... * 1,意思是将n乘以小于n的所有正整数。 在您的示例中,这只是相反的,因此您首先计算n - 1的阶乘,然后将其乘以n。继续这个递归,你计算n - 2,n - 3的阶乘,依此类推,直到你必须计算阶乘为1.在这种情况下,你只需返回1本身并返回递归链计算2的阶乘, 3,... n - 1,n。