五分钟重温斐波那契数列

斐波那契数列是数学领域内一个很是经典的算法问题(算法渣写下这句话的时候都在瑟瑟发抖),今天就用五分钟的篇幅来浅析一下这个问题。javascript

什么是斐波那契数列?

1,1,2,3,5,8,13,21......
斐波那契数列从第三项开始,每一项都等于前两项之和。
斐波那契数列是由数学家 Leonardoda Fibonacci 以兔子繁殖为例子而提出的,因此也叫作“兔子数列”前端

固然了,为了和计算机领域结合起来,这个问题会变成:实现一个函数f(n),求斐波那契数列的第n项是多少?(n始终为正整数)java

采用递归实现

有编程经验的你必定会想到递归。好的开始是成功的一半,若是你能想到递归,那么离成功已经不远了。
不难看出,数列的递推规律能够总结为:算法

f(n) = f(n-1) + f(n-2)
复制代码

okay,挽起袖子开撸编程

function fibonacci(num){
    if (num <= 2){
        return 1;
    }else{
        return fibonacci(num - 1) + fibonacci(num - 2);
    }
}
复制代码

乍一看,完美。
不过这个时候,但凡是个稍微有点追求的 Developer 都会说:“大兄弟你这么搞不是最优解呀,数字稍微大一点就炒鸡慢了。”数组

有缓存的 Fibonacci

虽然人艰不拆,可是优化仍是要作的。
我不由想到了前端性能优化里面最多见且好用的一条:缓存。大概的思路就是,将新算出来的值保存起来以便下一次使用。
Talk is cheap, show u the code缓存

let fibo = (function(){
    let cache = [];
    return function(n){
        if (cache[n] !== undefined){
            return cache[n];
        }else{
            return cache[n] = (n <= 2) ? 1 : fibo(n - 1) + fibo(n - 2);
        }
    }
})();
复制代码

乍一看,又是完美。
还能优化吗?固然。
这里用数组做为缓存容器,当计算过 fibo(50) 时,数组的长度是51,在给最后一项赋值以前,js会将前50项都置为 undefined,天然会影响效率。
一行代码完成优化:性能优化

// let cache = [];
let cache = {};
复制代码

生命不息,优化不止

优化是门学问,若是你还不愿善罢甘休的话,我也只能送你到这里了,毕竟本文的目的旨在帮你回忆起这么一道经典的题目(逃)。
若是某位数学大神看到了我这篇渣渣文,确定会十分不屑的反手就是一个通项公式,emmmmm你开心就好。前端性能

最后

新年快乐 : )函数

相关文章
相关标签/搜索