算法设计与分析2——递推算法

递推法是一种重要的数学方法。这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。

无论顺推还是逆推,其关键是要找到递推式

递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。

典型代表:Fibonacci数列的运用

1、数字三角形。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。

    (1)、 一步可沿左斜线向下或右斜线向下走;

    (2)、 三角形行数小于等于100;

       (3)、 三角形中的数字为0,1,…,99;

    测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:

5

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值