單說斐波那契數列
我們熟悉的斐波那契數列的問題即:
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...