轉載自 個人博客 面試
斐波那契數列你們應該再熟悉不過了,平時面試也常常會被問到,然而不知道你們有沒有考慮過它的效率呢?緩存
咱們通常給出的代碼應該是這樣的:閉包
function fibonacci(n) { if(n==0 || n == 1) return n; return fibonacci(n-1) + fibonacci(n-2); }
這段代碼邏輯徹底沒問題,可是若是你稍測試一下可能就會發現問題了,好比能夠試一下 fibonacci(70)
,這時你可能吃個飯回來它還沒執行完。測試
之因此叫它「變態版」,是由於在fibonacci(1000)
如下基本能夠在 5 毫秒以內完成,效率提高了 Infinity 倍,然而爲何差距這麼大?咱們先看個圖:優化
這是n = 5
的時候的計算過程,顯而易見,它包含了不少次重複的計算,優化它也很簡單,咱們只須要加個緩存(這裏用到了閉包),代碼以下:spa
var fibonacci = (function() { // 這裏我用了 Map,用普通對象也是能夠的 var cache = new Map(); return function(n){ if(n == 0 || n == 1){ cache.set(n,n); return n; } var v1 = cache.get(n-1) ? cache.get(n-1):fibonacci(n-1); var v2 = cache.get(n-2) ? cache.get(n-2):fibonacci(n-2); var nVal = v1 + v2; cache.set(n, nVal); return nVal; } })()