1.递推算法:通过已知条件,利用相邻的数据项间的关系(即:递推关系),得出中间推论,直至得到结果的算法。
2.基本思想:把一个复杂的庞大的计算过程转化为简单过程的多次重复。
3.递推与递归的比较:相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值
Fibonacci数列
int Fibonacci(int n)
{
if (n<0)
return -1;
int n1=1,n2=2,n3=3;
for (int i=3;i<=n;++i)
{
n3=n1+n2;
n1=n2;
n2=n3;
}
return n3;
}
汉诺塔问题
参考的信息奥赛的过河卒问题
#include<iostream>
#include<cstring>
using namespace std;
long long a[30][30];
int vis[30][30];
int next[][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
int main()
{
int n,m;
int x,y;
int nx,ny;
int i,j;
memset(vis,0,sizeof(vis));
cin>>n>>m>>x>>y;
a[0][0]=0;//处理A=B的情况
vis[x][y]=1;//设置马管辖的位置
a[x][y]=0;
for(i=0;i<8;i++)
{
nx=x+next[i][0];
ny=y+next[i][1];
if(0<=nx&&nx<=n&&0<=ny&&ny<=m)
{
vis[nx][ny]=1;
a[nx][ny]=0;
}
}
for(i=0;i<=n;i++)
{
if(vis[i][0]==1)
while(i<=n)
{
i++;
a[i][0]=0;
}
else
a[i][0]=1;
}
for(j=0;j<=m;j++)
{
if(vis[0][j]==1)
while(j<=m)
{
j++;
a[0][j]=0;
}
else
a[0][j]=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(vis[i][j]==0)
a[i][j]=a[i][j-1]+a[i-1][j];
cout<<a[n][m]<<endl;
return 0;
}