斐波那契數列是數學領域內一個很是經典的算法問題(算法渣寫下這句話的時候都在瑟瑟發抖),今天就用五分鐘的篇幅來淺析一下這個問題。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 都會說:「大兄弟你這麼搞不是最優解呀,數字稍微大一點就炒雞慢了。」數組
雖然人艱不拆,可是優化仍是要作的。
我不由想到了前端性能優化裏面最多見且好用的一條:緩存。大概的思路就是,將新算出來的值保存起來以便下一次使用。
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你開心就好。前端性能
新年快樂 : )函數