斐波那契数列
来源:互联网 发布:草图大师for mac破解 编辑:程序博客网 时间:2024/05/29 12:25
编程之美有一道题是关于斐波那契数列,作者提供了三种解决思路:
第一种解法:
根据递推关系定义:
其转换成递归树,该结构如图:
从上面递归树结构可以看出其有重叠情况,故编程之美提出可以用一个存储变量来存储其计算过的值来排除解决重复的计算的问题,其时间复杂度为O(N),空间复杂度也为 O(N)。
第二种解法:
根据线性递推数列定义:具有形如
斐波那契数列满足这条件,故可以求出其通项公式:
第三种解法:
斐波那契数列是二阶递推数列,所以存在一个2*2的矩阵A,使得:
求解可得:
因此可以推导出:
问题就是求
故有得出以下公式:
其中:
那么时间复杂度就是 O(
代码例子:
#include <iostream>#include<stdlib.h>#include<stdio.h>using namespace std;typedef long long LGLG;typedef long long (*maxtrix_poniter)[2];//单位矩阵LGLG result[2][2]={1,0,0,1};//辅助矩阵LGLG A[2][2]={1,1,1,0};//这里由于矩阵相乘元素不是很多,故采用了最普通矩阵相乘算法。maxtrix_poniter maxtriPow(const maxtrix_poniter A,int n){ //临时存储变量 LGLG temp[2][2]={0}; maxtrix_poniter m=A; for(;n;n>>=1) { //ai=1时才执行下面if语句 if(n&1) { //A和存储结果矩阵相乘,得到n右移后丢下那些数据的值A的次方 for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int multtemp=0; for(int k=0;k<2;k++) multtemp+=result[i][k]*m[k][j]; temp[i][j]=multtemp; } //拷贝数据 for(int i=0;i<2;i++) for(int j=0;j<2;j++) { result[i][j]=temp[i][j]; } } //两个A矩阵相乘得到下项A的值 for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int multtemp=0; for(int k=0;k<2;k++) multtemp+=m[i][k]*m[k][j]; temp[i][j]=multtemp; } //拷贝数据 for(int i=0;i<2;i++) for(int j=0;j<2;j++) { m[i][j]=temp[i][j]; } } return result;}int Fibonacci(int n){ if(n>=2) { maxtrix_poniter an=maxtriPow(A,n-1); return (1*an[0][0]); } else if(n==1) { return 1; } else { return 0; }}int main(){ cout << Fibonacci(9) << endl; return 0;}
参考资料:http://wenku.baidu.com/link?url=-qLKtdiRHn_UFDU9nwCU_fuNvK0cKZlPA2UxaFmJ67MW23zzPFMG89L85IklodeZcXU9N9PDw-QsNyRLy1YNGq_xK8H23Rp4KcrjI_LavVm
- 斐波那契数列数列计算
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- .bash_profile和.bashrc
- NSarray ...............
- OAF学习笔记-8-在AM中直接调用sql 语句(PLSQL函数)
- 正则表达式 (一) 快速入门
- eclipse 快捷键 Android开发常用
- 斐波那契数列
- redis 安装
- UIView的使用setNeedsDisplay
- 配置VMware Workstation 主机模式下让虚拟机上网设置详细
- 1016.部分A+B的解法
- 由“从按下回车到网页显示”粗谈网页优化
- 集团信息化 信息化常用专业术数及词汇汇总
- sql字段属性
- 阅读QtCreator--Concurrent预备知识