面試官期待的實用斐波那契解法

2021-10-04 05:06:08 字數 2072 閱讀 3955

單說斐波那契數列

我們熟悉的斐波那契數列的問題即:

0                  n=

0f(n) =

1 n=1f

(n-1)+

f(n-

2) n>

1

挑剔的面試官不會喜歡的解法,效率很低

**:

long

long

fibonacci1

(const

unsigned n)

我們乍一看我們剛學習斐波那契數列的時候就是這種解題思路,我們幾乎非常快就能寫出這個函式

但是面試官會告訴你:

來啊,我們來看一下 輸入 n = 10 的遞迴過程

f(10

)/ \

f(9)f(8

)/ \ / \

f(8)f(7

)f(7

)f(6

)...

....

....

....

....

..繼續分解下去

我們不難發現,重複遞迴計算的次數越來越多,因此效率很低,面試官不喜歡,我們來介紹下一種優化遞迴的解法。

面試官期待的解法1:記憶化陣列優化重複計算

思路:利用陣列記錄斐波那契數列中已經計算出的數列項值,之後重複呼叫時,直接返回記憶的數列項值,這樣就會避免重複遞迴計算。

所需條件:記憶化陣列 memo

**:

const

unsigned n=

100;

//輸入的n

int memo[n+2]

;//定義記憶化陣列

void

initmemoarr

(int arr)

long

long

fibonacci2

(const

unsigned n)

面試官期待的解法2:直接利用迴圈過程累加計算

思路: 我們利用 f(1)和f(2)能計算出 f(3) …以此迴圈類推能得出第 n 項。

所需條件

例如:求 4 項的值

f (2) = f(1) + f(0)

f (3) = f(2) + f(1)

f (4) = f(3) + f(2)

我們利用 3個變數:fibnminusone,fibnminustwo,fibn, 關係如下:

fibn = fibnminusone+fibnminustwo;
當得出新的 fibn 後,fibnminusone,fibnminustwo,fibn轉換關係如下:

fibn = fibnminusone+fibnminustwo;

//新 fibn 得出後,為fibnminusone,fibnminustwo重新賦值,即遞增項數值

fibnminustwo = fibnminusone;

fibnminusone = fibn;

這樣迴圈後就能得出 第 n 項的值(fibn)了

**:

long

long

fibonacci3

(const

unsigned n);if

(n<2)

return result[n]

;long

long fibnminusone =1;

//遞推的第一項

long

long fibnminustwo =0;

long

long fibn =0;

for(

int i =

2; i <=n ;

++i)

return fibn;

}

斐波那契數列解法

方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...

斐波那契數列解法

1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...

斐波那契數列的快速解法

求解斐波那契數列,要求時間複雜度為o logn 主要思路是快速冪和矩陣乘法的結合律 利用數學歸納法來證明。快速冪的思想 當n為偶數的時候 an an2 an2 當n為奇數的時候 an a n 1 2 a n 1 2 a那麼fn 的問題就可以換成求矩陣的n次冪了。實現 class solution p...