四种方法求解Fibonacci数列

来源:互联网 发布:ubuntu如何卸载cuda 编辑:程序博客网 时间:2024/05/20 14:22

   关于Fibonacci数列的求解方法探究

2016年9月1日


第一种方法:记忆化搜索

特点:同样的工作只做一次,克服了递归的不足之处

#include<iostream>#include<cstring>using namespace std;typedef long long LL;LL f[100];LL dp(int i){    if(f[i]!=-1) return f[i];    else return f[i]=dp(i-1)+dp(i-2);}int main(){    int n,T;    cin>>T;    memset(f,-1,sizeof(f));    f[0]=0;    f[1]=1;    dp(92);    //f[92]=7540113804746346429    while(T--)    {        cin>>n;        cout<<f[n]<<endl;    }    return 0;}


第二种方法:填表法

特点:过去一次性决定将来

memset(f,0,sizeof(f));f[0]=0;f[1]=1;for(int i=2;i<=92;i++)    f[i]=f[i-1]+f[i-2];


第三种方法:刷表法

特点:过去不断更新将来

memset(f,0,sizeof(f));f[1]=1;for(int i=1;i<=91;i++){    f[i+1]=f[i+1]+f[i];    f[i+2]=f[i+2]+f[i];}

第四种方法:矩阵快速幂

特点:效率高,应用线代知识

.


#include<iostream>#include<cstring>using namespace std;typedef long long LL;struct matrix{    LL v[2][2];    matrix(){memset(v,0,sizeof(v));}};matrix M,E,ans;//E为单位矩阵,ans为M^(n-1)void Init()//初始化{    for(int i=0;i<2;i++)        E.v[i][i]=1;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)            M.v[i][j]=1;    M.v[1][1]=0;}matrix mul(matrix a,matrix b)//矩阵乘法{    matrix c;    for(int i=0;i<2;i++)        for(int j=0;j<2;j++)            for(int k=0;k<2;k++)                c.v[i][j]+=a.v[i][k]*b.v[k][j];    return c;}matrix pow(matrix p,int k)//矩阵快速幂:利用二进制思想,不是二分的思想~{    matrix tmp=E;    while(k)    {        if(k&1)        {            tmp=mul(tmp,p);            k--;        }        k>>=1;        p=mul(p,p);    }    return tmp;}int main(){    int n;    Init();    while(cin>>n)    {        if(n==0)        {            cout<<"0"<<endl;            continue;        }        ans=pow(M,n-1);        cout<<ans.v[0][0]<<endl;    }    return 0;}


斐波那契数列的求法探究,可以使我们深刻认识并掌握有关递归,动态规划和矩阵快速幂的知识,

并让我们对各种算法的复杂度也有了一个较为清晰的认识。

是一道不错的探究作业~

1 0
原创粉丝点击