递归求阶乘和
编程题
任务描述
使用递归法计算1! + 2! + 3! + ... + n!1!+2!+3!+...+n!的值。
实现思路
求n的阶乘可以描述如下:
n!=n*(n-1)!n!=n∗(n−1)!
(n-1)!=(n-1)*(n-2)!(n−1)!=(n−1)∗(n−2)!
(n-2)!=(n-2)*(n-3)!(n−2)!=(n−2)∗(n−3)!
(n-3)!=(n-3)*(n-4)!(n−3)!=(n−3)∗(n−4)!
…
2!=2*1!2!=2∗1!
1!=0!1!=0!
0!=10!=1
1!=11!=1
如果把n!n!写成函数形式,即 f(n)
,则 f(5)
就是表示5!5!。求5!5!的过程可以写成如下形式:
f(5)=5*f(4)f(5)=5∗f(4)
f(4)=4*f(3)f(4)=4∗f(3)
f(3)=3*f(2)f(3)=3∗f(2)
f(2)=2*f(1)f(2)=2∗f(1)
f(1)=1f(1)=1
这样便可定义一个递归函数 fact
,用于计算nn的阶乘,递归边界为 n = 1
, 递归方式为 n * fact(n - 1)
;然后再定义一个递归函数 factsum
,用于计算阶乘和(计算方式和 fact
函数类似),递归边界为 n = 1
,递归公式为 fact(n) + factsum(n - 1)
。
- 函数定义
int fact (int n);
int factsum (int n);
注意:
两函数都应使用递归法实现. 函数fact
应返回nn的阶乘; 函数factsum
应返回1! + 2! + 3! + ··· + n!1!+2!+3!+⋅⋅⋅+n!的值.
此处为函数factsum
的返回值.
示例1
参数
n = 10
返回
4037913
#include <stdio.h>
int fact (int n) {
/*********** begin *************/
if(n==1) return 1;
else return n*fact(n-1);
/************ end **************/
return 0;
}
int factsum (int n) {
/*********** begin *************/
if(n==1) return fact(1);
else return fact(n)+factsum(n-1);/*注意此处不是加fact(n-1)*/
/************ end **************/
return 0;
}
int main () {
int n = 10;
int sum;
sum = factsum(n);
printf("%d", sum);
return 0;
}