Fibonacci数列

Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一 个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

常规方法

首先看到题目,第一想法就是递归实现,简单方便,易于理解。

public int fn(int n) {return n<=0?0:(n==1?1:fn(n-1)+fn(n-2));
}

虽然写法简单,但是明显能感觉到效率比较低。因为在递归的过程中,会出现大量的重复计算,显然这种方式是不可取的,当n值超出一定范围,程序会非常缓慢,甚至超时宕机。

高效方法

暂存递归

普通方法之所以效率低、计算慢,其原因就是出现大量的重复计算。如果我们将计算过的值暂存起来,实现重复利用。这样就可以避免递归次数,提高性能效率。

int arr[] = new int[n+1];
arr[1] = 1;public int fn(int n) {return n<=0?0:(n==1?1:(arr[n]!=0?arr[n]:(arr[n] = fn(n-1)+fn(n-2))));
}
  • 定义数组存储第一次计算的结果
  • 在递归体中若发现计算过,直接取值避免重复递归
  • 数组一定要在递归体外定义

暂存迭代

和上面的思路一样,也是定义一个暂时结构存放已计算过的结果。

public int fn(int n) {if (n<=0) return 0;int result[] = new int[n+1];result[0] = 0;result[1] = 1;for (int i=2;i<=n;i++){result[i] = result[i-1]+result[i-2];}return result[n];
}

累加迭代

用上一次计算的结果再计算。

public int fn(int n) {if (n<=0) return 0;int pre = 0;int next = 1;for (int i=0;i<n-1;i++){int temp = pre+next;pre = next;next = temp;}return next;
}

高效实现斐波那契数列(Fibonacci数列)相关推荐

  1. 算法题003 斐波那契(Fibonacci)数列

    斐波那契(Fibonacci)数列 题目来源 斐波那契(Fibonacci)数列是经典的递推关系式定义的数列. 第一项是0,第二项是1,之后的每一项都是前面两项之和. POJ3070:http://p ...

  2. 使用C语言求斐波那契(Fibonacci)数列的第n项

    题目: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 知识点: 递归:是在一个函数的内部调用这个函数自身.循环:则是通过设置计算的初始值及终止条件,在一个 ...

  3. 7-7 斐波那契(Fibonacci)数列前20项 (10 分)

    7-7 斐波那契(Fibonacci)数列前20项 (10 分) 输出斐波那契(Fibonacci)数列(1,1,2,3,5,8,13--)的前20项 链接 输出格式: 每个数输出占8列. 输出样例: ...

  4. 斐波那契(Fibonacci,意大利数学家,1170年-1240年)数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……。这个数列从第三项开始,每一项都等于前两项之

    Problem Description 斐波那契(Fibonacci,意大利数学家,1170年-1240年)数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--.这 ...

  5. 41【C#】斐波那契(Fibonacci)数列的第一个和第二个数分别为1和1 从第三个数开始,每个数等于其前两个数之和(1,1,2,3...)编写一个程序输出斐波那契数列中的前20个数,

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 斐波那契堆(Fibonacci heaps)

    一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆.斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看<算法导论>第17章).和 ...

  7. 七种方式求斐波那契(Fibonacci)数列通项

    一:递归实现   使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1. 二:数组实现   空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快. ...

  8. 斐波拉契(Fibonacci)数列

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

  9. 斐波那契(Fibonacci)数列

    基本定义 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1 ...

  10. 斐波那契(Fibonacci)数列问题

    斐波那契数列有如下特点: 第1,2两个数为1,1.从第三数开始,该数是其前面数之和.即 F1=1; F2=1; F3=F1+F2; Fn=Fn-1+Fn-2; 1,用for语句实现, 代码如下: #i ...

最新文章

  1. 英语 interactive tutorial unary
  2. comp 313 schemas的学习
  3. boost::python::detail::copy_ctor_mutates_rhs相关的测试程序
  4. 通过openpctv简单学习opkg安装与生成包的一些过程
  5. codeforces 734A-C语言解题报告
  6. 去掉开始菜单中新装程序的红色标记【Windows】
  7. 在线uml画图工具网站
  8. npm install 报错 this command with --force, or --legacy-peer-deps
  9. ppt矩形里面的图片怎么放大缩小_如何在PPT中插入大量图片而又保持其美感?
  10. 三菱q系列plc 和电脑socket_三菱Q系列Socket通讯(套接字通讯)讲解
  11. Windows起一个Docker镜像——起起起起起~不~来~
  12. android web3j 代币查询_ERC20代币转账以及余额查询--java(web3j)
  13. 微信小程序加密 MD5
  14. 李宏毅 Deeplearning课程学习笔记
  15. Java实现在线打开编辑保存PPT
  16. 【设计模式】JAVA 枚举实现策略模式
  17. selenium抓取卡推漫画--狐妖小红娘改进版
  18. 美通社日历 | 会展及重要事件信息、企业财报发布,节假日备忘(5月17日—5月23日)...
  19. IDEA 全局替换 增加前缀 后缀
  20. 【日本动漫十月新番尝鲜】吸血鬼骑士 第二季

热门文章

  1. html文档头部标记,HTML头部标记
  2. Freenom 申请免费域名(二)
  3. Bluemix RSA Private key cannot be used to encrypt
  4. 深度学习敲门砖——神经网络
  5. 利用计算机打字教学设计,四年级全一册信息技术教案-第1课正确的坐姿和指法--基本键打字练习 河大版...
  6. 计算机上的32位是什么意思啊,解答32位是什么意思
  7. android格式化sd卡软件,如何在各种设备中把SD卡格式化?附误格式化数据恢复方法!...
  8. IT人士如何提高软件下载的速度
  9. android八方向手势,Android开发中顺时针逆时针滑动手势的识别算法
  10. 重温51汇编指令(附实验)