動態規劃一 斐波那契數列

2021-09-20 06:31:14 字數 1103 閱讀 5058

【題目】寫乙個函式,輸入n,求斐波那契(fibonacci)數列的第n項。斐波那契數列的定義如下: 

public  long fib(int n)
以fib(5)為例:

深色部分的fib(3),以及fib(2)會被重複計算,當n增大時,遞迴樹高度增加,會有更多的重複計算;因此這種遞迴方法的效率非常低;考慮到遞迴方法,會有重複計算的缺點,因此考慮設定乙個陣列,儲存之前計算的結果,訪問fib(n)時,先檢視陣列中對應位置的值是否存在,若存在則直接返回,若不存在,則計算後,儲存到對應位置,然後返回;詳見方法二:

//將陣列 temp 定義為類變數,temp[i]表示fib(i)的值

long temp = new long[n+1];

public long fib(int n,long temp)

方法二用陣列temp儲存了每一步的計算結果,實現了自上向下的記憶化搜尋,避免了大量的重複計算;

//將陣列 temp 定義為類變數,temp[i]表示fib(i)的值

圖中的重疊子問題,是指在減小問題規模過程中,會有多次重複的操作;例如前文方法一遞迴方法中提到的多次重複計算;最優子結構是指在求解最優化問題時在問題規模減小過程中,原來規模的最優化問題可以轉化為子問題的最優化問題。詳見《動態規劃二:整數劃分求積》。針對重疊子問題和最優子結構問題,有兩種解決方法:記憶化搜尋(自頂向下);動態規劃(自底向上)。

動態規劃(一)斐波那契函式

遞推方程an an 1 an 2 a0 0 a1 1 int fibonacci int n else 問題 時間負複雜度太高有太多的重複計算,會導致時間複雜度為指數級 例如,求an時需要計算an 1 和an 2,求an 1時需要計算an 2 和an 3。解決,將重複計算用陣列dp儲存起來用的時候直...

動態規劃 斐波那契數列

問 大家都知道斐波那契數列,現在要求輸入乙個整數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...