前端菜鳥的每週一道演算法題(二) 斐波那契數列

極客James發表於2019-09-08

啥是斐波那契數列?

相信大家都不陌生,在高中數學中都有接觸過,斐波那契數列以如下被以遞推的方法定義:

F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

百度百科 -斐波那契數列

程式中的斐波那契數思想

我們平時用程式語言編寫的遞迴方法,其實就是斐波那契數列表示式,而表示式是可以推匯出通項公式的,這也是斐波那契數列在程式中最好的思想表達。

分析斐波那契數列的實現過程

斐波那契數,通常用 F(n) 表示,形成的序列稱為斐波那契數列。該數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是:

F(0) = 0,   F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 給定 N,計算 F(N)。

程式碼實現

方案一:最精簡通過遞迴,但是時間複雜度很高O(n^2),執行分析結果如下:

前端菜鳥的每週一道演算法題(二)  斐波那契數列

/**
 * @param {number} N
 * @return {number}
 */
var fib = function(N) {
    if (N<=1) return N;
    return fib(N-1) + fib(N-2);
};
複製程式碼

方案二:for迴圈,用兩個變數儲存前兩項斐波那契數即可。並且變數交換時也無需臨時變數,空間複雜度O(N)

前端菜鳥的每週一道演算法題(二)  斐波那契數列

/**
 * @param {number} N
 * @return {number}
 */
var fib = function(N) {
    if (N<2) return N;
    var frist = 0;
    var second = 1;
    for (var i=2;i<=N;i++) {
        second = frist + second;
        frist = second - frist;
    }
    return second;
};
複製程式碼

方案三:這個空間複雜度與時間複雜度都僅需O(N),while迴圈實現

/**
 * @param {number} N
 * @return {number}
 */
var fib = function(N) {
   var f = first,second =1;
    if (N == 0)  return 0;
        while(--N) {
            second = second + first;
            first= second-first;
        }
        return second;
};
複製程式碼

方案四:斐波那契通項公式

/**
 * @param {number} N
 * @return {number}
 */
var fib = function(N) {
  return Math.floor((Math.sqrt(5) / 5) * ( Math.pow((1 + Math.sqrt(5)) / 2, N) -  Math.pow((1 - Math.sqrt(5)) / 2, N)))
}
複製程式碼

可以複製以上程式碼到leetcode-斐波那契數列進行驗證。

歡迎小夥伴評論區提出更好的解決方案,記得點贊?鼓勵下哦!

掃一掃下面的二維碼,回覆學習即可免費領取最新前端學習資料,也希望在前端進階的路上,我們一起成長,一起進步!

前端菜鳥的每週一道演算法題(二)  斐波那契數列

相關文章