第十二题
3-11难度系数1 计算阶乘和 (5分)
第十题学习了递归
华师 PTA 2020程序设计基础实验作业题目集 编程题 #10 AC
这题来运用一下
首先是计算阶乘
先上代码
int f(int x){
if(x == 1)
return 1;
else
return x * f(x - 1);
}
让我们研究一下他的过程
调用 f(4)
f(4)
4*f(3)
4*(3*f(2))
4*(3*(2*f(1)))
4*(3*(2*1))
4*(3*2)
4*6
24
这样就计算出了4的阶乘
然后就是计算 和
上代码
int f2(int x){
int y;
y = f(x);
if(y == 1)
return 1;
else
return y + f2(x - 1);
}
自己按着上面的逻辑推导一下
有了这两个工具(函数)
接下来就是加上输入输出就行了
完整代码如下
#include<iostream>
using namespace std;
int f(int x){
if(x == 1)
return 1;
else
return x * f(x - 1);
}
int f2(int x){
int y;
y = f(x);
if(y == 1)
return 1;
else
return y + f2(x - 1);
}
int main(){
int inp;
cin >> inp ;
cout << f2(inp);
}
提交结果如下
当然,这个算法可以优化
观察
1+1*2+1*2*3+1*2*3*4+...
换个格式可能会更清晰
1+
1*2+
1*2*3+
1*2*3*4+
...
会发现,在计算第n项的阶乘是只需将已经计算好的第n-1项乘以n
那么代码就可以改成这么简单
#include<iostream>
using namespace std;
int main(){
int inp,mum = 1,sum = 0;
cin >> inp;
for(int i = 1; i <= inp; ++i) {
mum = mum * i;
sum = sum + mum;
}
cout << sum;
}
提交结果如下
果然,效率高了不少