*何为递推?
给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使得当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。
解决递推问题的一般步骤
1.建立递推关系式
2.确定边界条件
3.递推求解
递推的应用分类
1.一般递推问题
2.组合计数类问题
3.*一类博弈问题的求解
4.*动态规划问题的递推关系
ps:正在逐渐完善ing
递推的应用(一般递推问题)
Question.1上楼梯问题
题面:有一楼梯共M级,刚开始你在第一级,若每次只能跨上一级或两级,要走上M级,共有多少种走法?
Analysis
楼梯阶数 | 方法 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
6 | 13 |
7 | 21 |
… | … |
由题目可知,每次可以上一阶或两阶,由此可知,第n阶楼梯可以从第n-1阶楼梯和第n-2阶楼梯一步迈上来。如果走到n-1阶有a种走法,走上n-2阶有b种走法,那么,第n阶就有a+b种走法。
运用C++代码表示如下:
#include<iostream>
using namespace std;
int main()
{
long long a[10];
a[1]=1;a[2]=2;
for(int i=3;i<10;i++)
{
a[i]=a[i-1]+a[i-2];
cout<<i<<" "<<a[i]<<endl;
}
return 0;
}
除此之外较难的还有“汉诺塔问题”,有兴趣的可以去了解一下,未来我会专门写一个专题关于Hanoi塔的。
Hanoi代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
void Hanoi(int n,char src,char mid,char dest)
//有n个盘子,src为原位置,mid为中转位置,dest为目标位置
{
if(n==1){
cout<<src<<"->"<<dest<<endl;//只剩下一个盘子时的移动
return;
}
Hanoi(n-1,src,dest,mid);//把n-1个盘子从src移动到mid
cout<<src<<"->"<<dest<<endl;//把余下的那一个盘子从src移动到dest
Hanoi(n-1,mid,src,dest);//把mid上的n-1个帕子移动到dest
return ;
}
int main()
{
int n;
cin>>n;
Hanoi(n,'A','B','C');
return 0;
}
作者碎碎念:
其实理解Hanoi算法还是非常简单的,这个是递归算法的入门,但是很多新手ACMer有点难懂代码含义。说白了,就是把一个n的东西分拆成n-1,再把n-1分拆成n-2…依次处理,最后到1的时候return。
为了方便理解,可以用数据结构中“栈”的思想,手工分割解法,以3个盘子为例。
第一栈 | 第二栈 |
---|---|
2ACB | |
1ABC | |
3ABC | 2BAC |
以上是第三栈到第二栈的手工分割
第二栈又可分第一栈,这里不多演示了