欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

递推算法

程序员文章站 2024-03-16 11:02:52
...

算法特点:

一个问题的求解需要一系列的计算步骤。如果一个问题,将这个问题中所需要的数据提取出来,可以发现其中的数据之间的关系。那么就找到的递推公式,就可以编程序解决问题啦
思考的时候,如果发现正着找规律不合理,就试试倒着推。

典型例子

斐波那契额数列:1 1 2 3 5 8 13 …即前两项是1,之后的某一项=前两项之和f(n)=f(n-1)+f(n-2) n>=3

  • 大家肯定都知道斐波那契数列,把这个数列拿出来,咱们都能找到其中的规律。但是如果换成其他的实际问题,就很容易做不出来。

比如说

例题1
递推算法

  • 分析
    我们用R表示成熟的兔子,r表示新兔子。将前六项列出来如下:
    !递推算法
    我们可以发现,这就是一个斐波那契数列。
    小细节:在列举式,因为兔子分为两种情况。打兔子和小兔子,所以可以用大小写来表示,简单明了
#include <bits/stdc++.h>
using namespace std;
int Fibonacc(int n)
{
    int a[100];
    a[1] = 1;
    a[2] = 1;
    if (n >= 3)
    {
        for (int i = 3; i <= n; i++)
        {
            a[i] = a[i - 1] + a[i - 2];
        }
    }

    return a[n];
}
int main()
{

    int num;
    cin >> num;
    int sum = Fibonacc(num);
    cout << sum << endl;
}

例题2
这也是斐波那契数列

楼梯有n个台阶,上楼可以一步上一阶,也可以一步上两阶。一共有多少种上楼的方法?

当然

斐波那契额数列只是其中的一种,地推关键在于“推”。我们要拿出小学时找规律的乐趣来做这种题(哈哈哈,其实小学找规律很简单,但是遇到这种题我总是找不到,尴尬????)
例题
递推算法
思路:
如果按照题目,从第一个开始,就会发现:有两条路,每一条路后面的路会打不一样。比如说第一次我们选择8,但是可能8后面的数都很小,这样就找不到正确结果。所以我们倒着试试。
假设我们走到了倒数第二行,不一定是哪一个数,但是倒数第二行每一个数都会有两种情况选择,而且我们会选择较大的数。那么倒数第二行的书就确定了。最后一行别可以丢掉。以此类推,最后到第一行,就只有一个数,也就是最大的数。
递推算法

#include <bits/stdc++.h>
using namespace std;
int a[101][101];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
         cin>>a[i][j];
    }

    for(int p=n-1;p>=1;p--)
    {
        for(int q=1;q<=n;q++)
        {
            int r1,r2;
            r1=a[p][q]+a[p+1][q];
            r2=a[p][q]+a[p+1][q+1];
            if(r1>r2)
            a[p][q]=r1;
            else
            {
                a[p][q]=r2;
            }
            
        }
    }

    cout<<a[1][1];
}
相关标签: 算法