高效实现斐波那契数列(Fibonacci数列)
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数列)相关推荐
- 算法题003 斐波那契(Fibonacci)数列
斐波那契(Fibonacci)数列 题目来源 斐波那契(Fibonacci)数列是经典的递推关系式定义的数列. 第一项是0,第二项是1,之后的每一项都是前面两项之和. POJ3070:http://p ...
- 使用C语言求斐波那契(Fibonacci)数列的第n项
题目: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 知识点: 递归:是在一个函数的内部调用这个函数自身.循环:则是通过设置计算的初始值及终止条件,在一个 ...
- 7-7 斐波那契(Fibonacci)数列前20项 (10 分)
7-7 斐波那契(Fibonacci)数列前20项 (10 分) 输出斐波那契(Fibonacci)数列(1,1,2,3,5,8,13--)的前20项 链接 输出格式: 每个数输出占8列. 输出样例: ...
- 斐波那契(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.--.这 ...
- 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 ...
- 斐波那契堆(Fibonacci heaps)
一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆.斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看<算法导论>第17章).和 ...
- 七种方式求斐波那契(Fibonacci)数列通项
一:递归实现 使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1. 二:数组实现 空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快. ...
- 斐波拉契(Fibonacci)数列
斐波拉契数列一般指斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故 ...
- 斐波那契(Fibonacci)数列
基本定义 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1 ...
- 斐波那契(Fibonacci)数列问题
斐波那契数列有如下特点: 第1,2两个数为1,1.从第三数开始,该数是其前面数之和.即 F1=1; F2=1; F3=F1+F2; Fn=Fn-1+Fn-2; 1,用for语句实现, 代码如下: #i ...
最新文章
- 英语 interactive tutorial unary
- comp 313 schemas的学习
- boost::python::detail::copy_ctor_mutates_rhs相关的测试程序
- 通过openpctv简单学习opkg安装与生成包的一些过程
- codeforces 734A-C语言解题报告
- 去掉开始菜单中新装程序的红色标记【Windows】
- 在线uml画图工具网站
- npm install 报错 this command with --force, or --legacy-peer-deps
- ppt矩形里面的图片怎么放大缩小_如何在PPT中插入大量图片而又保持其美感?
- 三菱q系列plc 和电脑socket_三菱Q系列Socket通讯(套接字通讯)讲解
- Windows起一个Docker镜像——起起起起起~不~来~
- android web3j 代币查询_ERC20代币转账以及余额查询--java(web3j)
- 微信小程序加密 MD5
- 李宏毅 Deeplearning课程学习笔记
- Java实现在线打开编辑保存PPT
- 【设计模式】JAVA 枚举实现策略模式
- selenium抓取卡推漫画--狐妖小红娘改进版
- 美通社日历 | 会展及重要事件信息、企业财报发布,节假日备忘(5月17日—5月23日)...
- IDEA 全局替换 增加前缀 后缀
- 【日本动漫十月新番尝鲜】吸血鬼骑士 第二季
热门文章
- html文档头部标记,HTML头部标记
- Freenom 申请免费域名(二)
- Bluemix RSA Private key cannot be used to encrypt
- 深度学习敲门砖——神经网络
- 利用计算机打字教学设计,四年级全一册信息技术教案-第1课正确的坐姿和指法--基本键打字练习 河大版...
- 计算机上的32位是什么意思啊,解答32位是什么意思
- android格式化sd卡软件,如何在各种设备中把SD卡格式化?附误格式化数据恢复方法!...
- IT人士如何提高软件下载的速度
- android八方向手势,Android开发中顺时针逆时针滑动手势的识别算法
- 重温51汇编指令(附实验)