**一,递推算法概述:**
和枚举算法相比,递推算法就比较“聪明”了,递推算法能通过已知某个条件,利用特定的关系得出中间推论,
然后逐步递推,直到得到结果为止。
由此可见,递推算法要比枚举算法“聪明”,它不会"一根筋"的寻找每一种可能方案。
1)顺推法:从已知条件出发,逐步推算出要解决的方法。例如裴波那契数列就可以通过顺推法不断推算出新的数据。
(2)逆推法:从已知的结果出发,逐步推算出要解决的问题,即顺推法的逆过程。
斐波那契数列可以说是典型的逆推法,斐波那契数列,又称黄金分割率,指的是这样一个数列,1.1.2.3.5,,,,,,,,在数学上,斐波那契数列被以下递归的式子所定义,F(0)=0,
F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
下面来个递归算法的例子:
一个由正整数构成的三角形,从三角形的顶部到底部有多条不同的路径。
对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的下边(正下方)的数或者右边(右下方)的数。
输入第一行为三角形高度h,同时也是最低边层数字的数目:
从第二行开始,每行为三角形相应行的数字,中间用空格分隔。
输出最佳路径的长度数值。
样例输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出:
30
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
inline int max(int a,int b) {
return a>b?a:b;
}
int main() {
int n,d[110][110]= {0};
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=i; j++)
cin>>d[i][j];
for(int i=n; i>=1; i--)
for(int j=i; j>=1; j--)d[i][j]+=max(d[i+1][j],d[i+1][j+1]);
cout<<d[1][1]<<endl;
return 0;
}```
递归算法在写代码的过程中是比较常用的,故一定要掌握好!!!!!