方法一: 递归法

int Fib(int n){if(n==1 || n==2)  return 1;return Fib(n-1)+Fib(n-2);
}

递归法的时间复杂度为o(2^n)。
递归算法的程序看上去很简洁,但实际上运行起来却不如此,深度的递归会占用很多栈空间,容易造成溢出。另外在递归计算Fibonacci数列过程中有很多重复计算。比如,计算f(5)需要计算f(4),f(3)。计算f(4)时又要计算一遍f(3)。在n数字很大时,这样重复的计算非常耗时且没有意义。
方法二: 递推法(借用数组存储)
解决方法就是使用一个数组将算过的数保存起来,将递归法转为递推法。如果需要计算f(n),我们就从f(0)开始计算,一直计算到f(n)。
这样就消除了重复计算,因为每次计算新值都是从之前计算过的数组中取。递推法的时间复杂度为 O(n2),空间复杂度为 O(n)。

int Fibonacci(int n){int F[n+1];  //创建一个数组,存储计算过的值F[1] = 1;F[2] = 1;for(int i=3;i<=n;i++){F[i]=F[i-1]+F[i-2]; }return F[n];
}

方法三: 递推法优化(不用数组)
递推法其实还能够进行优化,可以不再使用数组存储,分析一下:在计算f(n)时我们只需要知道f(n-1)和f(n-2)两个值即可,即只保留数组中最后俩数即可,前面的元素已经没有存在的必要。因此我们使用两个变量来保存需要计算出f(n)的前两个元素即可。

int Fibonacci(int n){int tmp,k=0,ans=1;for(int i=2;i<=n;i++){tmp=k;    k=ans;    ans=k + tmp; }return ans;
}

分别用k和tmp保存我们需要的两个值,初始k代表 f(0),ans代表f(1), 令tmp=k临时保存f(0),k保存f(1),计算f(2) = f(0) + f(1),即ans=k + tmp,当计算完f(2)后 ,f(0)的值我们已经不需要了,此时为了计算f(3)我们需要的是f(1)和刚刚计算好的f(2), 重复上述步骤,令tmp=k临时保存f(1),k保存刚刚计算好的f(2)的值ans,然后计算f(3) = f(2) + f(1),即ans=k + tmp。依次类推…
优化后算法的空间复杂度为O(1)。

斐波那契Fibonacci 算法优化相关推荐

  1. 斐波那契数列在计算机的应用,斐波那契(Fibonacci)数列的几种计算机解法

    题目:斐波那契数列,又称黄金分割数列(F(n+1)/F(n)的极限是1:1.618,即黄金分割率),指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--.在数学上,斐波纳契数列以如下 ...

  2. 007.斐波拉契查找算法

    1. 斐波拉契查找算法 斐波拉契查找算法也称为黄金分割查找算法,它是在折半查找算法的基础上根据斐波拉契数列进行分割.折半法是取排序好的中间值进行分割,而斐波拉契查找算法是根据黄金分割点进行分割. 黄金 ...

  3. 斐波那契(Fibonacci)数列计算器设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/85734538 资源下载地址:https://download.csdn.net/downl ...

  4. C++以字符串形式返回第N个斐波那契的算法(附完整源码)

    C++以字符串形式返回第N个斐波那契的算法 C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main函数测试) C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main ...

  5. 查找算法:斐波那契查找算法实现及分析

    斐波那契查找算法介绍 斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列.所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧.1:0.618或者1.618:1,我们的 ...

  6. 查找算法之斐波那契查找算法

    斐波那契(黄金分割法)查找算法 (一)算法简介 (1)斐波那契数列 在讲算法之前,我们先介绍一下斐波那契数列,该数列公式为F(K) = F(k-1) + F(k-2),即 1.1.2.3.5.8.13 ...

  7. 斐波那契查找算法解析

    文章目录 前言 一.斐波那契数列 二.斐波那契查找算法 前言 学数据结构的时候被斐波那契查找算法困扰,刚开始难以理解,脑袋有点懵,翻看了许多大佬的博文,加上自己的理解发了出来 一.斐波那契数列 我们先 ...

  8. 【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现

    目录 1. 插值查找算法 1.1 插值查找算法的介绍 1.2 插值查找算法的程序实现 2. 斐波那契查找算法 2.1 斐波那契查找算法的介绍 2.2 斐波那契查找算法的程序实现 1. 插值查找算法 1 ...

  9. PHP 算法之斐波那契数列算法 计算出生兔子的数量

    <斐波那契数列算法> 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:一对兔子也 ...

最新文章

  1. Android studio 设置忽略文件
  2. jquery的实时触发事件(textarea实时获取中文个数)
  3. Android 百度鹰眼轨迹SDK(v2.1.6)
  4. PAT甲级1153 Decode Registration Card of PAT :[C++题解]结构体、哈希表、排序、类似数据库查询题、好题
  5. 沫沫金Echarts移动端demo
  6. 南师大632c语言程序设计,单片机c语言学习心得632.docx
  7. android 按钮按下缩放,android捏缩放
  8. 记录执行hivesql时报org.apache.hadoop.hdfs.BlockMissingException:Could not obtain block错误
  9. Linux导出history命令到本地
  10. mysql库的user表误删除或mysql的管理员密码丢失的解决方法
  11. Luogu5816 [CQOI2010]内部白点
  12. Java 面向对象面试题
  13. ReactNative 仿造 ofo 共享单车快速开发的app
  14. .md文件的打开与软件---markdown
  15. 51单片机控制数码管显示hello,012345,以及apple自动切换
  16. CREO学习笔记【钣金结构中常用的标准件】
  17. 我对SAP培训的理解(转)
  18. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(喷倒面试官
  19. Matlab三维绘图------三维曲线图
  20. ChatGPT国内在线版、微信版

热门文章

  1. 计算机毕业设计Java智能健身房管理(源码+系统+mysql数据库+lw文档)
  2. mysql使用混合引擎如何,mysql – 使用MyISAM和InnoDB引擎的数据库的一致逻辑备份...
  3. python接口测试完善
  4. 微信小程序录音上传php代码,小程序实现录音上传功能
  5. 人手一份的中国城市道路名图鉴 | Alfred数据室
  6. 电动吞吐式ISO14443ISO15693多功能IC卡磁条读写器M100接口说明
  7. cybersource支付对接
  8. 快乐乒乓球网重推砂板IP,真是一场好戏!
  9. 锂电池循环查询android,手机锂电池到底能用多久,其实循环400次就不耐用了!...
  10. 顶尖众筹商业模式实操案例分享,打开你全新的赚钱思维!