函数题:求阶乘之和(高效递归版)
请编写函数,用递归方法求阶乘之和。
$$SumFac(n) = 0! + 1! + 2! + 3 + \cdots + n!$$
#### 函数原型
c
double SumFac(int x);
说明:参数 x 为非负整数,函数值为 0 到 x 的阶乘之和。
要求:直接通过递归求得结果。
#### 裁判程序
c
#include <stdio.h>
double SumFac(int x);
int main()
{
int n;
scanf("%d", &n);
printf("%.10g\n", SumFac(n));
return 0;
}
/* 你提交的代码将被嵌在这里 */
#### 输入样例1
in
4
#### 输出样例1
out
34
#### 输入样例2
in
70
#### 输出样例2
out
1.215221118e+100
提示:需要编写两个函数。首先编写一个递归函数,不妨命名为 SumFac1,直接调用自己得到计算结果;然后再编写 SumFac 函数,它的作用只是给出适当参数来调用 SumFac1 来完成计算。
答案:若无答案欢迎评论
若设计递归函数
double SumFac1(int m, int n);
来计算 $$m! + (m + 1)! + ... + n!$$。
很容易得到递推公式:$$SumFac1(m, n) = m! + SumFac1(m + 1, n)$$
怎样快速计算 $$m!$$ 呢?
如果给函数添加一个参数,把 $$(m - 1)!$$ 传进来,把它乘以 $$m$$ 就能迅速得到 $$m!$$。
修改函数的原型,增加一个参数 p:
double SumFac1(int m, int n, double p);
其中参数 p 为 $$(m - 1)!$$。
因此在调用 SumFac1 函数时要给出 p 的起始值 1,这个任务就交给 SumFac 函数了。
这样,递归算法的时间复杂度也能降到 $$O(n)$$ 了。
$$SumFac(n) = 0! + 1! + 2! + 3 + \cdots + n!$$
#### 函数原型
c
double SumFac(int x);
说明:参数 x 为非负整数,函数值为 0 到 x 的阶乘之和。
要求:直接通过递归求得结果。
#### 裁判程序
c
#include <stdio.h>
double SumFac(int x);
int main()
{
int n;
scanf("%d", &n);
printf("%.10g\n", SumFac(n));
return 0;
}
/* 你提交的代码将被嵌在这里 */
#### 输入样例1
in
4
#### 输出样例1
out
34
#### 输入样例2
in
70
#### 输出样例2
out
1.215221118e+100
提示:需要编写两个函数。首先编写一个递归函数,不妨命名为 SumFac1,直接调用自己得到计算结果;然后再编写 SumFac 函数,它的作用只是给出适当参数来调用 SumFac1 来完成计算。
答案:若无答案欢迎评论
若设计递归函数
double SumFac1(int m, int n);
来计算 $$m! + (m + 1)! + ... + n!$$。
很容易得到递推公式:$$SumFac1(m, n) = m! + SumFac1(m + 1, n)$$
怎样快速计算 $$m!$$ 呢?
如果给函数添加一个参数,把 $$(m - 1)!$$ 传进来,把它乘以 $$m$$ 就能迅速得到 $$m!$$。
修改函数的原型,增加一个参数 p:
double SumFac1(int m, int n, double p);
其中参数 p 为 $$(m - 1)!$$。
因此在调用 SumFac1 函数时要给出 p 的起始值 1,这个任务就交给 SumFac 函数了。
这样,递归算法的时间复杂度也能降到 $$O(n)$$ 了。