斐波那契數列 動態規劃入門

2021-10-04 21:44:46 字數 1134 閱讀 9963

斐波那契數列的定義是 f(n + 1) = f(n) + f(n - 1) ,有幾種解法:

遞迴法:

原理: 把 f(n)問題的計算拆分成 f(n−1) 和f(n−2) 兩個子問題的計算,並遞迴,以 f(0)和 f(1)為終止條件。

缺點: 大量重複的遞迴計算,例如 f(n)和 f(n - 1)兩者向下遞迴需要 各自計算 f(n−2) 的值。

有備忘錄的遞迴法:

原理:也就是在遞迴法的基礎上建立乙個備忘錄(長度為 n 的陣列),用於在遞迴時儲存 f(0)至 f(n)的數字值,重複遇到某數字判斷如果計算過則直接從陣列取用,避免了重複的遞迴計算。

缺點: 備忘錄儲存需要使用 o(n) 的額外空間。

動態規劃:

原理: 以斐波那契數列性質 f(n + 1) = f(n) + f(n - 1)為轉移方程。動態規劃與遞迴相反,它從底向上計算直到頂層。與已知f(0)=0,f(1)=1,建立陣列記錄狀態,然後遍歷,這種方法因為計算過的值都存在陣列裡,所以不會重複計算。遇到需要的值直接從陣列中去取。

int

fib(

int n)

;for

(int i =

2; i <= n;

++i)

arr[i]

=(arr[i-1]

+ arr[i-2]

)%1000000007

;//不會讓數太大導致越界。

return arr[n]

;}

求餘運算規則: 設正整數 x, y, px,y,p ,求餘符號為⊙ ,則有(x+y)⊙p=(x⊙p+y⊙p)⊙p 。

解析: 根據以上規則,可推出f(n)⊙p=[f(n−1)⊙p+f(n−2)⊙p]⊙p。從而可以在迴圈過程中每次計算sum=(a+b)⊙1000000007 ,此操作與最終返回前取餘等價。

節約空間的迭代:

在動態規劃過程中發現,每次用到的僅僅是前兩次的值。因此可以用兩個常數每次遍歷更新值來計算。

public

intfib

(int n)

return a;

}

從計算效率、空間複雜度上看,節約空間的迭代是本題的最佳解法。當然還有其它解法,比如快速矩陣冪。無奈本人太菜,暫時沒掌握。

動態規劃 斐波那契數列

問 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 斐波那契數列簡單介紹 我的解法 注 從fibonacci n 1 fibonacci n 2 明顯看出使用的是遞迴,此題用遞迴兩三行 即可搞定。但是,若出題者準備著乙個超大的n,那麼很有...

python斐波那契數列動態規劃

斐波那契類似於1 1 2 3 5 8這樣的數列,當前項等於前兩項之和。根據這個規律就可以用遞迴來做,可是當數字很大的時候,遞迴耗時很長,因此可以採用動態規劃來做。動態規劃 deffeibonacci1 n array 0 1 while len array n 1 array 2 return ar...

演算法 動態規劃篇 斐波那契數列

斐波那契數列,又稱 分割數列,指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 在數學上,斐波納契數列以如下被以遞迴的方法定義 f0 0,f1 1,fn f n 1 f n 2 n 2,n n 在現代物理 準晶體結構 化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1960年代起...