菲波那契数列,大致可以描叙为a(n) = a(n-1) + a(n-2) (a >=2)。类似于这样[1, 1, 2, 3, 5, 8, 13 ...]。

具体大家可以百度一下。下面我们来用js获取菲波那契数列的第N个数为多少:

1.递归

var a = function(n) {
if (n === 1 || n === 2) {
return 1
} else {
return a(n - 1) + a(n - 2)
}
}
console.time('a(44)')
console.log(a(44))
console.timeEnd('a(44)')

以上我们可以比较清晰的看出代码的思路,但是这种方法有一个致命的缺点:效率太差!

不信你看:

执行到第44个的时候,已经不能接受了。需要5s多。那我们再来改进一下

--------------------------------------------------------------------------------

2.闭包+缓存

var b = (function() {
var cache = {
1: 1,
2: 1
}
return function(n) {
if (cache[n]) {
return cache[n]
} else {
cache[n - 1] = b(n - 1)
cache[n - 2] = b(n - 2)
return cache[n - 1] + cache[n - 2]
}
}
})() console.time('b(1200)')
console.log(b(1200))
console.timeEnd('b(1200)')

将每一步计算出来的值,保存到了缓存中。效率提升了许多:

------------------------------------------------------------------

3.直接计算出该数列的值得数组,然后再从数组中取值

var c = function(n) {
var arr = [1, 1]
if (n === 1 || n === 2) {
return 1
}
for (var i = 2; i < n; i ++) {
arr[i] = arr[i - 1] + arr[i - 2]
}
return arr[n - 1]
} console.time('c(1200)')
console.log(c(1200))
console.timeEnd('c(1200)')

这样效率又进一步提高了不少:

那这样还有没有更快的方法呢?当然有!菲波那契数列是有数学表达式的:

我们为何不直接使用数学表达式呢?

-----------------------------------------------------

4.直接使用数学表达式

var d = function(n) {
return (1/(Math.pow(5, 1/2))) * (Math.pow((1 + Math.pow(5, 1/2))/2, n) - Math.pow((1 - Math.pow(5, 1/2))/2, n))
} console.time('d(1200)')
console.log(d(1200))
console.timeEnd('d(1200)')

现在我们看一下效果:

所以总结一下:数学真美!^_^

js获取菲波那契数列的第N个元素的更多相关文章

  1. e8_4输出菲波拉契数列的前10项

    program fbnq;{输出菲波拉契数列的前10项} var a:..] of integer; i:integer; begin a[]:=; a[]:=; do a[i]:=a[i-]+a[i ...

  2. OpenJudge 2753 菲波那契数列

    1.链接地址: http://bailian.openjudge.cn/practice/2753 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列 ...

  3. 递推-练习1--noi1760 菲波那契数列(2)

    递推-练习1--noi1760 菲波那契数列(2) 一.心得 二.题目 1760:菲波那契数列(2) 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数 ...

  4. 递归--练习6--noi1755菲波那契数列

    递归--练习6--noi1755菲波那契数列 一.心得 二.题目 1755:菲波那契数列 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和 ...

  5. python基础===通过菲波那契数列,理解函数

    def fib(n): # write Fibonacci series up to n """Print a Fibonacci series up to n.&quo ...

  6. OpenJudge1.5.17 菲波那契数列

    17:菲波那契数列 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和. 给出一个正整数k,要求 ...

  7. JS实现斐波那契数列的几种方法

    斐波那契数列指的是这样一个数列:1.1.2.3.5.8.13.21.34.…… 前两项为1,从第三项起,每一项等于前两项的和,即F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n& ...

  8. JS 从斐波那契数列浅谈递归

    一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能 ...

  9. JS写斐波那契数列的几种方法

    斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...

随机推荐

  1. ExtJs--12--Ext定义类的requires uses singleton 三个配置项的使用

    Ext.onReady(function(){ /* * requires uses singleton 三个配置项的使用 */ Ext.define("A",{ //requir ...

  2. Java程序员应该知道的10个Eclipse调试技巧

    Eclipse是众多Java程序员实用的开发工具,其中开发技巧也是繁多,但作为优秀的Java程序员,需要掌握最起码的调试技巧. 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 ...

  3. C# DataTable 转换成JSON数据

    原文:C# DataTable 转换成JSON数据 using System; using System.Collections.Generic; using System.Data; using S ...

  4. Springmvc+Spring+Hibernate搭建方法

    Springmvc+Spring+Hibernate搭建方法及example 前面两篇文章,分别介绍了Springmvc和Spring的搭建方法,本文再搭建hibernate,并建立SSH最基本的代码 ...

  5. weblogic生产、开发模式互转

    生产模式与开发模式转换: 1.生产模式-->开发模式     将%DOMAIN_HOME%\config\config.xml文件中<production-mode-enabled> ...

  6. 【Linux 工作经常使用命令 】

    1, 批量杀某个程序 比方某个程序叫  url_info.py, 起了若干个进程 . 高速查杀. 先查看 ps aux | grep url_info.py 确认没问题 ,能够杀,则批量kill ps ...

  7. CQRS架构

    CQRS架构 命令查询的责任分离Command Query Responsibility Segregation (简称CQRS)模式是一种架构体系模式,能够使改变模型的状态的命令和模型状态的查询实现 ...

  8. leetcode[88] Gray Code

    题目:格雷码. 格雷码是从0开始且之后两个相邻码之间只有一个符号不相同,例如000,100,101,111三个相邻之间只有一个二进制不同. 现在给定一个数字n,然后给出格雷码所对应的数字.例如: Fo ...

  9. MVC5入门学习系列④

    添加Model且简单的使用EF 对于EF(EntityFramework)不了解的朋友可以去百度文科或者在园子里搜一些简资源看下,假如和我一样知道EF的概念,那么就知道EF有一个code first的 ...

  10. asp.net、mvc、ajax、js、jquery、sql、EF、linq、netadvantage第三方控件知识点笔记

    很简单,如下: 父页面:(弹出提示框) function newwindow(obj) { var rtn = window.showModalDialog('NewPage.htm','','sta ...