求斐波拉契數列第n位演算法優化

2022-03-10 17:52:40 字數 947 閱讀 9142

在面試題中經常遇到求斐波拉契數列值的問題,最常見演算法是使用遞迴的方式,本篇部落格介紹如何優化該演算法效能。

斐波拉契數列的特性是: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 這不正是斐波拉契數列...