四种方法求解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
- 四种方法求解Fibonacci数列
- 两种方法求解Fibonacci数列
- Fibonacci数列求解方法总结
- 三种方法求解Fibonacci(斐波那契)数列
- 三种方法求解Fibonacci(斐波那契)数列
- 探索Fibonacci数列的最佳求解方法
- Fibonacci数列求解
- 求解Fibonacci数列
- fibonacci数列四种不同解法思路。
- Fibonacci数列(四)
- Fibonacci数列(四)
- Fibonacci数列(四)
- 七种方法求Fibonacci数列
- NYOJ Fibonacci数列(四)
- acm-Fibonacci数列(四)
- Fibonacci(斐波纳契)数列求解 zz
- Fibonacci数列的应用和求解
- 浅议Fibonacci(斐波纳契)数列求解
- Java-OkHttp-03-Post
- javaEE——Spring 四种切面技术(拦截)、获取Spring容器的两种办法
- Java-数据库-sqlite01
- POJ 1678 I Love this Game!(博弈)
- 运算符重载
- 四种方法求解Fibonacci数列
- Java-数据库-sqlite02
- 第11讲-自测项目3
- Windows编程 我与Direct的第一次 简单颜色显示的实现
- leetCode No.268 Missing Number
- 字符串指针与字符数组的区别
- selector的使用及执行流程
- Java-servlet-01
- Java设计模式之策略模式