斐波那契數列 遞推 遞迴 備忘錄 動態規劃

2021-07-01 20:58:56 字數 1310 閱讀 4920

當n=0時,f(n) = 0     

當n=1時,f(n) = 1

當n>1時,f(n) = f(n-1) + f(n-2)

遞迴演算法:

[cpp]view plain

copy

intfun(

intn)    

備忘錄方法:

[cpp]view plain

copy

#include 

using

namespace

std;  

const

intn = 100;  

intf[n];  

intfun(

intn)  

if(n == 1)  

coutreturn

f[n];  

}  int

main()    

由於計算的時候只需要前兩個數即可,所以**還可以繼續優化。但是對於上述的備忘錄方法貌似不能繼續進行空間優化了(不知道對否,如果理解的不對請不吝賜教~)。

但是對於下面的方法(就稱為遍歷方法吧),還是可以繼續優化的。  

自底向上的動態規劃

[cpp]view plain

copy

#include 

using

namespace

std;  

const

intn = 100;  

intf[n];  

intmain()  

cout<

return

0;  

}  

斐波那契數(動態規劃)

通過把所計算的值儲存在遞迴過程的外部陣列中,明確地避免重複計算。這一程式計算的時間與n成正比。

int f(int i)

自頂向下的動態規劃

由於計算的時候只用了前兩個數,所以沒有必要使用陣列。

[cpp]view plain

copy

#include 

using

namespace

std;  

intmain()  

}  cout<

return

0;  

}  

總結:從**中可以看出來,遍歷方法實際上是一種自底向上的方法,而備忘錄方法是一種自頂向下的方法,也許正由於這個原因造成了備忘錄方法無法進行空間優化。(待證)

斐波那契數列 動態規劃 遞迴(帶備忘錄)

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0,第1項是1 n 39 直接由斐波那契數列的定義f n f n 1 f n 2 可以得到遞迴的公式,為了避免重複求解已經結果的問題,可以使用備忘錄 即陣列 將備忘錄初始化為 1,遞迴時進行判斷,若已經求...

斐波那契數列 遞迴備忘錄解法(簡單理解)

1.如果讓我們遞迴解決,我們通常使用這一段 來解決斐波那契數列問題 int fib int n 確實簡單又好懂,可是這段 細思極恐,時間複雜度是指數級的o 2n 這可了不得。那麼為什麼它的時間複雜度這麼高呢?我們畫出遞迴樹 注意 fib8 和fib8是一樣的,筆者不太會用這個圖所以只能這樣了。我們可...

演算法 斐波那契數列 遞迴 遞推

2.解決方案 3.資源分享 題目 斐波那契數列 遞迴 遞推 動態規劃 問題描述 斐波那契數列是非常經典的演算法問題,理解他的數學思想對我們程式猿程式設計有極大的幫助。輸入 每個輸入用例包含乙個正整數n 0 n 30 你的目標是計算f n 輸出 可能有多組輸入資料,對於每組輸入資料,輸出一行,這一行輸...