js获取菲波那契数列的第N个元素
菲波那契数列,大致可以描叙为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个元素的更多相关文章
- e8_4输出菲波拉契数列的前10项
program fbnq;{输出菲波拉契数列的前10项} var a:..] of integer; i:integer; begin a[]:=; a[]:=; do a[i]:=a[i-]+a[i ...
- OpenJudge 2753 菲波那契数列
1.链接地址: http://bailian.openjudge.cn/practice/2753 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列 ...
- 递推-练习1--noi1760 菲波那契数列(2)
递推-练习1--noi1760 菲波那契数列(2) 一.心得 二.题目 1760:菲波那契数列(2) 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数 ...
- 递归--练习6--noi1755菲波那契数列
递归--练习6--noi1755菲波那契数列 一.心得 二.题目 1755:菲波那契数列 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和 ...
- python基础===通过菲波那契数列,理解函数
def fib(n): # write Fibonacci series up to n """Print a Fibonacci series up to n.&quo ...
- OpenJudge1.5.17 菲波那契数列
17:菲波那契数列 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和. 给出一个正整数k,要求 ...
- 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& ...
- JS 从斐波那契数列浅谈递归
一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能 ...
- JS写斐波那契数列的几种方法
斐波那契数,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字 ...
随机推荐
- servlet请求转发与重定向的差别------用生活实例来形象说明两者的差别
1,请求重定向:client行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保留,地址栏的URL地址会改变. 2,请求转发:server行为,req ...
- 快速构建Windows 8风格应用35-触控输入
原文:快速构建Windows 8风格应用35-触控输入 引用 Windows 8设备通常具有多点触摸屏,用户可以同时使用多个手指来进行不同的输入交互,如点击.拖动或收缩等手势操作.另外Windows ...
- 对于发Github的contributions贡献不会增加
最近发现每天在 Github 做代码提交,可是 contributions 的面板(贡献图)上的绿点(即贡献值)却没有增长了.擦~ 有两个礼拜了. 例如以下图并且.同一时候发现曾经的绿点也是稀稀拉拉的 ...
- Inno Setup技巧[界面]欢迎页面上添加文字
原文:Inno Setup技巧[界面]欢迎页面上添加文字 本文介绍在"欢迎页面添加文字"的两种方法. 界面预览: Setup技巧[界面]欢迎页面上添加文字" title= ...
- 免费的编程中文书籍索引 from github
免费的编程中文书籍索引 免费的编程中文书籍索引,欢迎投稿. 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版. stackoverflow 上的程序员应该阅读的非编程类书籍有哪些 ...
- JAVA开发语言基础
很多时候我们都不知道,为什么android最开始要用java作为基础语言 看看知乎上都是怎么回答的 为什么java最初成为android开发的基础语言 ------------------------ ...
- sql材料分级统计及汇总案例参考
--第一步:根据系统编号.列.单价分组求和 select CLBH,DJ,sum(SL) as SL,sum(JE) as JE,Lie into #TempSZCMX from #ShouZhiCu ...
- mysql删除和修改数据报错1175
当用MySQL Workbench进行数据库的批量更新时,执行一个语句会碰到以下错误提示: Error Code: 1175 You are using safe...without a WHERE ...
- Model Validation(模型验证)
Model Validation(模型验证) 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/344 ...
- 【转】iOS 开发者必不可少的 75 个工具
原文地址:Ben 译文地址:伯乐在线 如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发 ...