js获取菲波那契数列的第N个元素
来源:互联网 发布:高分一号卫星数据价格 编辑:程序博客网 时间:2024/06/08 11:31
菲波那契数列,大致可以描叙为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)')
现在我们看一下效果:
所以总结一下:数学真美!^_^
阅读全文
0 0
- js获取菲波那契数列的第N个元素
- JS算法(获取斐波那契数列的前n项)
- 1242 . 斐波那契数列的第N项
- 斐波那契数列的第N项
- 1242 斐波那契数列的第N项
- 斐波那契数列的第n项。
- 输出斐波那契数列的第n项
- 求解斐波那契数列的第n个数
- 不用递归方法实现斐波那契数列,输入数字n 将会输出该数列的第n个数字
- 算法学习记录六(C++)--->获取斐波那契数列第n项
- 写一个函数,输入n,其斐波那契数列的第n项。
- 求斐波那契数列的第 n 项的值
- 求斐波那契数列的第N个数的值
- 求斐波那契 (Fibonacci) 数列第 n 项的算法
- 求斐波那契 (Fibonacci) 数列第 n 项的算法
- 求斐波那契数列的第n个数
- 第 N 项斐波那契数列的值—Java
- 求斐波那契数列的第n项
- Log4j 启动出现 WARN Unsupported encoding
- [Leetcode] 171. Excel Sheet Column Number 解题报告
- phpredis中文手册——《redis中文手册》 php版
- 生成WORD
- 远程计算机或设备将不接受连接,谷歌浏览器无法上网
- js获取菲波那契数列的第N个元素
- Windows下 VM12虚拟机安装OS X 10.11(详细教程)
- org.springframework.beans.factory.BeanCreationException
- ArcGIS Engine 几何对象和WKB的转换
- 关于windows下phpstorm+vmware的lnmp共享文件夹问题的最佳实践
- ArcMap中使用ArcPy实现Geometry与WKT的相互转换
- 814/ A. An abandoned sentiment from past
- 56. Merge Intervals
- 进程与线程