关于c++递归函数总结
内容还不完善,随时更新
递归的概念
是指在函数的定义中使用函数自身的方法。通俗理解就是:我调用我自己。
下面请看案例:
#include<bits/stdc++.h>
using namespace std;
void meng(int n){
printf("进入第%d层梦\n",n);
if(n==3){
cout<<"醒来吧"<<endl;return ;//结束函数
}
meng(n+1);//递归
print("回到第%d层梦\n",n);
}
int main(){
cout<<"小明开始做梦"<<endl;
meng(1);//调用函数
cout<<"小明完全醒了"<<endl;
return 0;
}
它的运行结果是:
小明开始做梦
进入第1层梦
进入第2层梦
进入第3层梦
醒来吧
回到第2层梦
回到第1层梦
小明完全醒了
那么我们不难发现,输出语句写在递归语句前和写在递归语句后的执行方式正好相反。这就表示我们的递归函数存在两种状态-------递和归(传递和返回)
理解递归的实现
- 在确定一个递归问题时,需要寻找问题中各个子问题之间的关系。
- 另外递归是有限的,所以我们需要找到一个递归出口。
以阶乘问题为例
n的阶乘等于从1到n之间所有正整数的乘积。
使用递归函数计算阶乘(题目来源:洛古)
分析:
1 ! = 1 1!=1 1!=1
2 ! = 1 ∗ 2 2!=1*2 2!=1∗2
3 ! = 1 ∗ 2 ∗ 3 3!=1*2*3 3!=1∗2∗3
4 ! = 1 ∗ 2 ∗ 3 ∗ 4 4!=1*2*3*4 4!=1∗2∗3∗4
5 ! = 1 ∗ 2 ∗ 3 ∗ 4 ∗ 5 5!=1*2*3*4*5 5!=1∗2∗3∗4∗5
- 分析问题与子问题之间的关系
n ! = n ∗ ( n − 1 ) ! n!=n*(n-1)! n!=n∗(n−1)! - 找出递归出口(递归终止条件)
固定值:1!=1
下面就可以编写代码了:
#include<bits/stcc++.h>
using namespace std;
int fact(int x){
if(x==1) return 1;//递归出口
return x*fact(x-1);//递归规律
}
int main(){
int n;
cin>>n;
cout<<fact(n);//调用阶乘函数
return 0;
}
递归题目总结
题目来源均在洛古
1.斐波那契数列
2.cantor表
3.放苹果
4.求 1+2+3+…+N 的值
5.阿克曼(Ackmann)函数
6.digit 函数
7.Hermite 多项式
8.求 f(x,n)
9.再求 f(x,n)