[演算法] Fibonacci:善用 cache 和 Memoization 提升程式效能
@([Udemy] Learning Algorithms in JavaScript from Scratch)[Algorithm, JavaScript]
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
Memoization 是一種優化的技巧,透過藉由將函式的回傳值暫存起來,來提升效能,一旦發現有相同的輸入時(same inputs),就直接回傳暫存值出去。這裡的關鍵字就是「相同的輸入(same inputs)」。
前置知識: 費波那契數列(Fibonacci Sequence)
費波那契數列(Fibonacci Sequence)指的是:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
每個數字都是前兩個數字的和,例如 1+1=2, 1+2=3, 2+3=5, 3+5=8, ...,以此類推。
問題描述
建立一個函式 fibonacci
代入參數 position
,position 表示的是想要得到 fibonacci sequence 中的第幾個數字的值。
function fibonacci (position) {...}
fibonacci(4) // 3
fibonacci(9) // 34
使用遞回函式
這裡一樣可以透過遞回函式來處理,我們先觀察一下 Fibonacci Sequence:
fibonacci(1); // 1
fibonacci(2); // 1
fibonacci(3); // 2 fibonacci(2) + fibonacci(1)
fibonacci(4); // 3 fibonacci(3) + fibonacci(2)
fibonacci(5); // 5 fibonacci(4) + fibonacci(3)
fibonacci(6); // 8 fibonacci(5) + fibonacci(4)
從上面我們可以發現,除了 position 為 1 和 position 為 2 的情況之外,其他的都是前兩個相加,也就是:
fibonacci(position) === fibonacci(position - 1) + fibonacci(position - 2);