动态规划求解斐波拉契数列

。_饼干妹妹 提交于 2020-02-03 04:04:10

求解斐波拉契数列方法的改进

斐波拉契数列的求解相信大家都不陌生,最简单的方法就是简单递归,但事件复杂度为2的n次方。今天我将用动态规划的方法,将事件复杂度降到n,空间复杂度降到1
原始方法:简单递归,代码如下

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 30
using namespace std;

int fibonacci(int n)
{
    if(n == 0 || n == 1)
        return 1;
    else
        return fibonacci(n-1)+fibonacci(n-2);
}
int main()
{
    int n,res;
    cout<<"请输入斐波那契梳理数列的n:"<<endl;
    cin>>n;
    res = fibonacci(n);
    cout<<"结果:"<<res;
    return 0;
}

改进方法:动态规划,代码如下(所谓的动态规划,简单理解就是用一张表记录原问题分解成的子问题的解的结果,如用简单递归解斐波那契数列时,计算f(5)时,利用f(5)= f(4)+f(3),但计算 f(4)时又会用到 f(3),若能在计算 f(4)时将 f(3)的结果记录下来,就能减少递归次数)

自底而上

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 50
using namespace std;

int fb[maxnum];  //记录子问题的结果
int fibonacci(int n)
{
    fb[0] = fb[1] = 1;
    if(n < 2)
        return 1;
    else
    {
        for(int i=2; i<=n; i++)
            fb[i] = fb[i-1]+fb[i-2];
        return fb[n];
    }
}
int main()
{
    int n,res;
    cout<<"请输入斐波那契梳理数列的n:"<<endl;
    cin>>n;
    res = fibonacci(n);
    cout<<"结果:"<<res;
    return 0;
}

自顶而下(递归改进)

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 50
using namespace std;

int fb[maxnum] = {0};  //记录子问题的结果
int fibonacci(int n)
{
    fb[0] = fb[1] = 1;
    if(n < 2)
        return 1;
    else
    {
        if(fb[n] != 0)   //若结果已经计算过并存储在了fb数组中,则不需要在递归
            return fb[n];
        else
        {
            return fibonacci(n-1)+fibonacci(n-2);
        }
    }
}
int main()
{
    int n,res;
    cout<<"请输入斐波那契梳理数列的n:"<<endl;
    cin>>n;
    res = fibonacci(n);
    cout<<"结果:"<<res;
    return 0;
}



实际上不需要将每个结果都存储,只需要存储n-1和n-2,在次改进空间复杂度

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 50
using namespace std;

int fibonacci(int n)
{
    int a = 1,b = 1;
    if(n < 2)
        return 1;
    else
    {
        for(int i=2; i<=n; i++)
        {
            b = a + b;
            a = b - a;
        }
        return b;
    }
}
int main()
{
    int n,res;
    cout<<"请输入斐波那契梳理数列的n:"<<endl;
    cin>>n;
    res = fibonacci(n);
    cout<<"结果:"<<res;
    return 0;
}



** 希望能给你带来帮助,欢迎留言指正**

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!