求解答一下递归算阶乘
.
为什么 int recurse = factorial(n - 1); 这句话是阶乘,里面也没有运算符号呀
.
public static int factorial(int n) {
if (n == 0) {
return 1;
}
int recurse = factorial(n - 1);
int result = n * recurse;
return result;
}
参考GPT和自己的思路:
这里的递归实现的是计算阶乘的函数,递归过程是不断地调用函数自身来求解。在这个计算阶乘的函数中,n 指的是要计算阶乘的数,而递归调用的是计算 n-1 的阶乘。递归调用的过程会不断地调用函数自身,直到最小值 0,然后逆向递归回来求解。
在这个计算阶乘的函数中,int recurse = factorial(n - 1); 是指递归调用函数来计算 n-1 的阶乘,这里并没有运算符号的出现,因为递归调用函数已经实现了计算和乘法的操作。
nt recurse = factorial(n - 1);
这不后面还要乘以 n 么
n! = (n-1)! * n
这句不是阶乘,这句是递归,后面n * recurse才是阶乘
-=-=-=
这里简单说一下循环和递归的思路到底有什么区别
循环的思路是先知道了第1项和从k到k+1项的通项公式,然后从第1项开始迭代,一直迭代到第n项结束
而递归是倒过来,先搞第n项,那么利用从k到k+1项的公式,要先去取得第n-1项的值,这样一直迭代到第1项最终拿到值
参考GPT和自己的思路:
这个递归函数的实现是基于数学上的阶乘概念,n的阶乘就是从1一直乘到n的连续自然数乘积。在递归函数中,递归的计算过程就是将n的阶乘拆分成n和(n-1)的阶乘乘积,因此这句话是用递归函数计算(n-1)的阶乘,并赋值给了recurse变量。然后result变量用来存储最终的阶乘结果,即将n与recurse相乘。因为在递归函数中已经进行了递归计算,因此并不需要显式的运算符号。
result = n * recurse; 这行才是计算n的阶乘 ,recurse为(n-1)的阶乘,n*recurse即n乘以(n-1)的阶乘,它就是n的阶乘。
测试代码如下:
public class FactorialTest {
public static int factorial(int n) {
if (n == 0) { // 用于返回1的阶乘的结果,此项改为n==1也可以
return 1;
}
//保存前一项阶乘的结果 ,factorial(n - 1)会不断递归到factorial(0),用它来计算1的阶乘
int recurse = factorial(n - 1);
System.out.println("factorial("+(n-1)+")="+recurse);
int result = n * recurse; // 此项n乘以前一项的阶乘,即为n的阶乘
System.out.println("n="+n+","+n+"*factorial("+(n-1)+")="+result+"\n");
return result; //
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 3;
int result = factorial(num);
System.out.println(num+"的阶乘结果是"+result);
// factorial(3) = 3*factorial(2)
// factorial(2) = 2*factorial(1)
// factorial(1) = factorial(0)
// factorial(0) = 1
}
}