题目描述
求 n!(n≤12),也就是 1×2×3…×n。
挑战:尝试不使用循环语句(for、while)完成这个任务。
输入格式
无
输出格式
无
输入输出样例
输入 #1
3
输出 #1
6
思路
直接一个for循环枚举,水题!
本题题目说要尝试不用循环来做,那我们就用另一种方法–递归。比如说,国王要求6!,但他只知道6!=6 * 5!,他就告诉宰相,让宰相求5!。而宰相接到命令后只知道5!=5 * 4!,他又让后面的人来算…而一直到了最后一个人,他要求1!,他知道1!为1,于是上报给倒数第二个人,倒数第二个人知道了,就求出了2!=2 *1!=2 *1=2,紧接着有继续上报…最后,国王就知道6!等于几了。这就是用递归求解阶乘的方法所以我们可以写一个递归函数来求n!。
递归函数代码如下:
#define ll long long//用ll替换long long,简称偷懒
int n;
ll num(int n)//定义函数
{
if(n==1) return 1;//边界值,即最后1!=1
else return n*num(n-1);//否则告诉下一个人要他求(n-1)!
}
code
#include<bits/stdc++.h>
#define ll long long//用ll替换long long,简称偷懒
using namespace std;
ll n;//定义n
ll num(int n)//定义函数
{
if(n==1) return 1;//边界值,即最后1!=1
else return n*num(n-1);//否则告诉下一个人要他求(n-1)!
}
int main()
{
cin>>n;//读入n
cout<<num(n)<<endl;//输出递归后n!
return 0;
}
当然也奉上计算阶乘的普通做法:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
long long num=1;
for(int i=1;i<=n;i++) num*=i;
cout<<num<<endl;
return 0;
}