说到递推算法,我们最能够想到的当属斐波那契数列了,今天,我们就以它为例子,来介绍一下递推思想吧。(以下故事纯属胡扯,请不要相信当真。
相传从前在一个快乐世界有两只可爱的小兔子,还有一个养兔人叫斐波那契,两只小兔子每天快快乐乐的蹦跳在快乐星球上,一蹦就是几千年。
原来,在快乐星球上,只要你快乐,就不会死!
于是,养兔人和两只可爱兔子快乐的生活在快乐星球上。
直到有一天,斐波那契一觉醒来,发现多了蹦跳快乐的两只小兔子时,他惊呆了。
此后,他发现,刚生下来的小兔子下个月就会长大,下下个月就会开始每个月生两只小兔子。
为了防止快乐星球超载,斐波那契研发出了不快乐试剂,同时,他需要记录兔子的数量,如果超载了,他就要消灭一部分快乐兔子。
于是,不记录还好,一记录吓一跳,他发现(只记录生的,因为最开始两只兔子有感情了,不舍得杀:
月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
小兔子 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 |
大兔子 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 |
兔子总数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
斐波那契他惊讶的发现,兔子总数居然是前两个月总数的和,于是,这个发现我就成为斐波那契数列。
而其中用到的思想,我们称为递推思想(Ysum为每个月兔子的总数:
Ysum[n]=Ysum[n-1]+Ysum[n-2];
由此可见,递推思想就是当前面我们求出的值后后面有影响、关联、规律且我们知道最开始的值为多少时,我们就可以采取递推思想。
下面是递推思想(斐波那契数列)的代码:
#include<iostream>
using namespace std;
int Ysum[110];
int main()
{
Ysum[1]=1;
Ysum[2]=2;
for(int i=3;i<=100;i++)
{
Ysum[i]=Ysum[i-1]+Ysum[i-2];
}
for(int i=1;i<=10;i++)
{
cout<<Ysum[i]<<" ";
}
return 0;
}
另一种:
#include<iostream>
using namespace std;
int dt(int Y)//想要求第几月的总数
{
if(Y==1)return 1;//已知一月总数为1
if(Y==2)return 1;//已知2月总数为1
return dt(Y-1)+dt(Y-2);//返回值为前两个月的总数
}
int main()
{
for(int i=1;i<=10;i++)
{
cout<<dt(i)<<" ";
}
return 0;
}
这里可能有对子函数的运用不是很清晰的,这里用一个图来方便大家理解:
dt子函数会进行如图所示的操作知道找到Y为1或2时返回值1然后返回上一部操作。