参考链接:[https://juejin.im/entry/5ab452b56fb9a028d3755376][[https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97]
https://segmentfault.com/a/1190000007115162
1. 定义:
维基百科上写道斐波那契数列是以递归的方法来定义,
f0 = 0;
f1 = 1;
fn = f(n-1) + f(n-2);
用文字来解释就是斐波那契数列是从 0 和 1 开始,之后的每一项都是前两项之和而得出。(注意:0 不是第一项,而是第 0 项)
2. js 中斐波那契数列的用法:
2.1 函数递归方法:
这种方法性能特别低,原因有两个,其一:函数不断调用自己(每一次执行的函数就会形成一个调用帧),所有的调用帧会形成调用栈,内存的消耗大;其二:不断重复计算,如果基数很大,那么计算量大,影响性能。
//fib(n)的结果为前 (n-1)项之和,即函数不断调用自身,一层一层减少,直到num 的值为0或1;
function fib(num){
if(num === 0 || num === 1) return num;
return fib(n-1) + fib(n-2)
}
fib(6) //8
2.2 递推法:
利用局部变量来记录每一层中计算的结果,比起递归方法的优点是内存消耗降低了
function fib(num){
let current = 0;
let next = 1;
let temp;
for(let i = 0;i < num; i++){
temp = current;
current = next;
next += temp;
}
return current;
}
2.3 ES6 解构赋值的方法:
借助ES6解构赋值的特性,从数组中临时缓存和提取每一层的结果
function fib(num){
let current = 0;
let next = 1;
for(let i =0;i<num;i++){
[ current , next ] = [ next , current + next ]
}
return current;
}
2.4 缓存效果最高的方法:
var fib = (function(){
var memory = {};
return function(num){
if(num === 0 || num === 1)
return num
}
if(memory[n-2] === undefined){
memory[num-2] === fib(num - 2)
}
if(memory[n-1] === undefined){
memory[num-1] === fib(num - 1)
}
return memory[num] = fib(num-1) + fib(num - 2)
})()
等我进阶算法时再回来填坑(不小心又挖了坑,逃),待更新动态规划解决方案!
网友评论