递推法是一种重要的数学方法。这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。
无论顺推还是逆推,其关键是要找到递推式。
递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。
典型代表:Fibonacci数列的运用
1、数字三角形。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。
(1)、 一步可沿左斜线向下或右斜线向下走;
(2)、 三角形行数小于等于100;
(3)、 三角形中的数字为0,1,…,99;
测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
分析:从递推的思想出发,a[i][j]=max{a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]},a[1][1] 即为所求的数字总和的最大值。
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
int Max(int a,int b,int sum)
{
if(a>b)
sum=sum+a;
else
sum=sum+b;
return sum;
}
int main()
{
int x,y;
int a[100][100];
int n;
cin>>n;
for(x=1;x<=n;x++)
for(y=1;y<=x;y++)
cin>>a[x][y];
for(x=n-1;x>0;x--)
for(y=1;y<=x;y++)
a[x][y]=Max(a[x+1][y],a[x+1][y+1],a[x][y]);
cout<<a[1][1];
}
2、楼梯有n个台阶,上楼可以一步上一阶,也可以一步上两阶。一共有多少种上楼的方法?
分析:这是一道计数问题。在没有思路时,不妨试着找规律。试通过n=1、n=2、n=3、n=4、n=5可推得到递推式:f(n)=f(n-1)+f(n-2),不要忘记边界情况:f(1)=1,f(2)=2。由此可推测为Fibonacci数列
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int sum=3;
cin>>n;
if(n<=2&&n>=1)
sum=n;
else
{
int a[100];
a[1]=1;a[2]=2;
for(int i=3;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
sum=a[n];
}
cout<<sum;
}