[Algorithm] Fibonacci numbers (費波那契數列)
Fibonacci numbers 說明
以下轉自維基 斐波那契数列
費氏數列由0和1開始,之後的斐波那契數就是由之前的兩數相加而得出。首幾個斐波那契數是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……(OEIS中的數列A000045)
特別指出:0不是第一項,而是第零項。
範例程式碼
Ruby 範例
附上 Ruby 的 online sandbox,有興趣可以把 code 貼進去玩玩看
def fibonacci(num)
  return num if num == 0 || num == 1
  fibonacci(num - 1) + fibonacci(num - 2)
end
puts fibonacci(10)
結果如下

不過這種使用遞迴的解法,複雜度是 O(n^2)
也就是說當傳入的 num 數值越大時,運算時間會呈指數成長
我們可以使用 Memoization 技巧來進行最佳化
- 檢查數字是否存在 cache 中
 - 如果存在則使用 cache 中的數字
 - 如不存在則將數字算出來放在 cache 中,以便之後做使用
 
利用這種演算法,複雜度是 O(n)
也就是說當傳入的 num 數值越大時,運算時間只會以線性成長
@cache = [0, 1]
def fibonacci(num)
  return @cache[num] if @cache[num]
  @cache[num] = fibonacci(num - 1) + fibonacci(num - 2)
end
puts fibonacci(10)
結果如下

JavaScript 範例
JavaScript 的 online sandbox,有興趣可以把 code 貼進去玩玩看
function fibonacci(num) {
    if (num === 1 || num ===2) {
        return 1
    } else {
        return fibonacci(num - 1) + fibonacci(num - 2)
    }
}
console.log(fibonacci(10))
結果如下

使用 Memoization 技巧
function fibonacci(num, cache) {
    cache = cache || {}
    if (cache[num]) {
        return cache[num]
    }
    if (num < 3) {
        return 1
    }
    return cache[num] = fibonacci(num - 1, cache) + fibonacci(num - 2, cache)
}
console.log(fibonacci(10))
結果如下
