斐波那契数列: f(n)=f(n-1)+f(n-2); n>=2
f(0)=0; f(1)=1;
即有名的兔子繁衍问题。
斐波那契数列共有三种解法,因而写这篇文章总结一下。
1. 递归求解
递归求解比较简单,是大家常见的一种解法。

int fibonacci(int n)
{cout<<"calculating "<<n<<endl;if (n<=0) {return  0;}if (n==1) {return 1;}return fb(n-1)+fb(n-2);
}

关于这种解法,不再赘述,下面主要说下时间复杂度分析。
设f(n)为参数为n时的时间复杂度,很明显:f(n)=f(n-1)+f(n-2)
这就转化为了数学上的二阶常系数差分方程,并且为其次方程。
即转化为了求f(n)的值,f(n)=f(n-1)+f(n-2)且f(0)=0; f(1)=1;
特征方程为:x^2-x-1=0
得 x=(1±√5)/2
因而f(n)的通解为:

由f(0)=0; f(1)=1可解得c_1,c_2
最终可得,时间复杂度为:

2. 第一种解法比较简单,但是多个元素重复计算,因而时间复杂度较高,为了避免重复计算,可进行循环计算减少时间复杂度

    int Fibonacci(int n) {if (n<=0) {return 0;}if (n==1) {return 1;}int min=0;int max=1;int i=2;int result=0;while (i<=n) {result=min+max;min=max;max=result;++i;}return result;}

第二种算法时间复杂度为O(n)
3. 还有一种时间复杂度更低的算法。
根据上面的递归公式,我们可以得到

因而计算f(n)就简化为了计算矩阵的(n-2)次方,而计算矩阵的(n-2)次方,我们又可以进行分解,即计算矩阵(n-2)/2次方的平方,逐步分解下去,由于折半计算矩阵次方,因而时间复杂度为O(log n)
具体代码实现如下:

//
//  main.cpp
//  fibonaccimatrix
//
//  Created by shunagao on 15/8/31.
//  Copyright © 2015年 shunagao. All rights reserved.
//#include <iostream>
using namespace std;class Matrix
{
public:int n;int **m;Matrix(int num){m=new int*[num];for (int i=0; i<num; i++) {m[i]=new int[num];}n=num;clear();}void clear(){for (int i=0; i<n; ++i) {for (int j=0; j<n; ++j) {m[i][j]=0;}}}void unit(){clear();for (int i=0; i<n; ++i) {m[i][i]=1;}}Matrix operator=(const Matrix mtx){Matrix(mtx.n);for (int i=0; i<mtx.n; ++i) {for (int j=0; j<mtx.n; ++j) {m[i][j]=mtx.m[i][j];}}return *this;}Matrix operator*(const Matrix &mtx){Matrix result(mtx.n);result.clear();for (int i=0; i<mtx.n; ++i) {for (int j=0; j<mtx.n; ++j) {for (int k=0; k<mtx.n; ++k) {result.m[i][j]+=m[i][k]*mtx.m[k][j];}   }}return result;}
};
int main(int argc, const char * argv[]) {unsigned int num=2;Matrix first(num);first.m[0][0]=1;first.m[0][1]=1;first.m[1][0]=1;first.m[1][1]=0;int t;cin>>t;Matrix result(num);result.unit();int n=t-2;while (n) {if (n%2) {result=result*first;}first=first*first;n=n/2;}cout<<(result.m[0][0]+result.m[0][1])<<endl;return 0;
}

斐波拉契数列的三种解法相关推荐

  1. 斐波拉契数列 Java三种实现

    对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...

  2. 斐波拉契数列的三种实现方法

    百度解释 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子 ...

  3. C语言--斐波那契数列(三种方法)

    文章目录 一·介绍 二·代码实现 1·递归实现 2·迭代实现 3·数组实现 一·介绍 斐波那契数列,就是前两个数是1,之后从第三个数开始等于前面两个数的和,请用代码方式求出第n个斐波那契数列的大小. ...

  4. 剑指Offer #07 斐波那契数列(四种解法)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 题目解析 ...

  5. 蒟蒻君的数学学习之路1:斐波那契数列的n种解法

    文章目录 ⭐前言 ⭐一. 递推

  6. c语言编程斐波那契前n项,c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)...

    写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include in ...

  7. python 函数 1.1 斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和。

    题目:  已知斐波拉契数列的前两项都是1,我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下: n=int(input("")) print(fbnq ...

  8. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  9. c语言n次方怎么输入_C语言实现斐波拉契数列

    C语言实现斐波拉契数列教程 怎么使用 C 语言实现计算斐波拉契数列的第 N 项的值? C语言实现斐波拉契数列详解 背景知识 斐波那契数列是一组第一位和第二位为 1,从第三位开始,后一位是前两位和的一组 ...

最新文章

  1. Debugging JTAG
  2. ios 不同sdk4.3 6.0版本号,关于方法的兼容性的通用方法
  3. android复位机器人图片,安卓(Android)新图标!小绿机器人换脸啦
  4. java类与对象 —(10)
  5. C#抓取网页HTML内容
  6. java filter 模式,Java设计模式----过滤器模式(挑三拣四)
  7. Django View和URL
  8. Javaoop_继承
  9. Python雷电小游戏、战机小游戏源代码源程序
  10. 小米Air3笔记本拆机踩坑教程
  11. 思维导图组件@hellowuxin/mindmap的基本使用
  12. 14周 上 购物案列
  13. html input 宽度自适应,CSS实现input宽度根据输入内容自适应
  14. 中国移动云mas短信http协议对接
  15. 归一化函数normalize
  16. 数学证明凸透镜成像原理
  17. acm刷题一些总结,至每一个努力拼搏的acmer
  18. 休闲经营的农场小游戏推荐,果蔬连连看h5版游戏玩法技巧
  19. Mothur1进阶_走近Mothur,探索未知
  20. php interface 抽象类,解析PHP中的抽象类(abstract class)和 接口(interface)

热门文章

  1. Github博客备份
  2. 【2012.03.3普及组】打牌
  3. 从GitLab拉取项目到本地
  4. php之新特性trait详解
  5. Qt强大控件:Qt-Advanced-Docking-System介绍及使用教程
  6. Android:RecyclerView简单理解和基本使用
  7. 利用python从网易云喜欢歌单中获取适合跑步的歌曲
  8. 前端页面显示图片jpg和png
  9. 【讲大道理】参加什么信息学比赛对升学有帮助?
  10. statsmodels线性回归中的Jarque-Bera指标检验残差是否服从正态分布