在面試題中經常遇到求斐波拉契數列值的問題,最常見演算法是使用遞迴的方式,本篇部落格介紹如何優化該演算法效能。
斐波拉契數列的特性是:n=(n-2)+(n-1)
首先使用遞迴的方式求斐波拉契數列第30位:
static void main(string args)執行結果:public static int fun(int n)
return fun(n - 2) + fun(n - 1);
}
遞迴的方式致使 fun() 方法被多次重複呼叫,此時的空間複雜度為 o(n),時間複雜度為 o(2ⁿ),n的值越大,時間複雜度也就越大。為避免fun() 被多次重複呼叫,減小時間複雜度,我們可以用陣列來儲存計算出來的資料。
public static int fun(int n)執行結果:return array[n - 1];
}
執行程式時間比遞迴方式的小,效率明顯提公升,此時時間複雜度為 o(n),空間複雜度為 o(n),但是我們發現,在計算n的值時,我們只需最新的三個數,前面的數就不需要了,那麼我們可以定義三個常量來減少空間複雜度。
public static int fun(int n)執行結果:return third;
}
此時程式執行時間和上個方法相差無幾,但是此時的空間複雜度從 o(n) 變成了0,時間複雜度為 o(n),所以這種方式是非常高效的。
斐波拉契數列 演算法
斐波那契數列是一組第一位f1和第二位f2為1,從第三位開始,後一位是前兩位和的一組遞增數列fn fn 1 fn 2。那麼當n比較大時,fn也非常大,現在我們想知道,第n項,fn等於多少 如 輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,包含乙個整數,表示fn。樣例輸入10此時fibonacc 樣...
求第n個斐波拉契數
首先介紹斐波那契數列,斐波那契數列的排列是 1,1,2,3,5,8,13,21,34,55,89,144 依次類推下去,你會發現,它後乙個數等於前面兩個數的和。在這個數列中的數字,就被稱為斐波那契數。如果要找出其中任意乙個數,可以用下面兩種演算法解決 用遞迴法 define crt secure n...
快速求斐波拉契數列
首先,我們先計算如下的式子 f i f i 2 f i 1 f i 3 2f i 2 2f i 4 3f i 3 這時,我們假設當前為 f i a f j b f j 1 則是不是 f i a b f j 1 a f j 2 等等,係數是不是有點眼熟 1,1,2.a,b,a b 這不正是斐波拉契數列...