2. 解決方案
3. 資源分享
題目:斐波那契數列_遞迴_遞推_動態規劃問題描述:
斐波那契數列是非常經典的演算法問題,理解他的數學思想對我們程式猿程式設計有極大的幫助。
輸入:每個輸入用例包含乙個正整數n(0 <= n <= 30),你的目標是計算f(n);
輸出:可能有多組輸入資料,對於每組輸入資料,
輸出一行,這一行輸出f(n)的值;
樣例輸入:
1樣例輸出:
1
斐波那契數列的關鍵就是推算他的表示式,自第二項開始,每一項都等於前兩項之和,由此推得表示式:
f(1)=1;
f(2)=1;
f(n)=f(n-1)+f(n-2); (n >= 2)
對於遞迴方式來說,傳入引數n,若n等於1或者等於0則直接返回值,若n大於等於2返回f(n - 1) + f(n - 2)的值即可;
對於遞推方式來說,開闢乙個有三個元素的整形陣列儲存,初始狀態設定為前三項的值,後面每次根據%3得到的值選擇某乙個元素的位置替換,%3得到的那個點正好是我們之前計算結果得到的最初的那個值,也就是本次計算之後得到的值應取代的值的位置,遞推結束之後,返回值即可;
對於動態規劃方式,開闢乙個比較大的整數型組儲存我們已經計算出的f(n)值,這樣便於後續計算。動態規劃的思想是利用dp陣列儲存每一次我們計算得到的f(n)值,這樣之後計算如果再用到這個值時就不需要遞迴或者遞推去計算這個值了,因為我們的dp陣列裡已經儲存了這個值,可以極大地提公升計算速度,減少計算時間,而需要注意的點就是dp陣列邊界初始化為-1,這樣便於我們計算dp陣列以及直接返回計算過的f(n)的值,若dp[n]不等於-1說明這個f(n)我們已經計算過了,直接返回他的值,若不是則計算他的值,dp[n] = f(n - 1) + f(n - 2),最後返回這個dp[n]的值;
在三種方式中,動態規劃方式記錄了每一次的計算結果,對於大量資料來說處理時間最短,速度最快,遞推次之,而遞迴稍顯遜色最慢;
當然,如果只有幾組資料,並且計算的數字都比較小,那麼動態規劃就不是最快的演算法了,具體情況看遇到的演算法題目來考慮應用吧!
有關遞斐波那契數列的數學知識,遞迴,遞推,動態規劃的程式設計思想;
遞迴
#include
using
namespace std;
int n, ans;
intfibonacci
(int n)
;int
main
(void
)return0;
}int
fibonacci
(int n)
遞推
#include
#include
#include
using
namespace std;
#define maxlength 1000
int n, ans;
intfibonacci
(int n)
;int
main
(void
)return0;
}int
fibonacci
(int n)
, i;
// 斐波那契數列前三項為0, 1, 1
if(n >2)
else
i = n;
return t[i %3]
;}
動態規劃
#include
using
namespace std;
#define maxlength 1000
int dp[maxlength]
, n, ans;
intfibonacci
(int n)
;int
main
(void
)return0;
}int
fibonacci
(int n)
}
斐波那契數列的遞推和遞迴演算法
斐波那契這個人人熟知的數列已經是個說爛的話題了,今天舊話重提,咱也來乙個朝花夕拾,呵呵 面試的時候遇到了這個面試題,最丟人的是,我沒做出來,哈哈 回頭想想,這不就是斐波那契嗎,只是用不同的情況表達了出來,最開始接觸程式的時候,使用兔子表達的,具體的敘述這裡不說了,因為我比較懶,哈哈 面試的時候居然是...
遞迴演算法斐波那契數列
有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...
斐波那契數列的遞迴 遞推演算法比較
公式 f n 1 f n f n 1 f 0 f 1 1 網上找到的乙個最簡單例子,修改了兩個bug 遞迴演算法 int f1 int n if n 2 return 1 else return f1 n 1 f1 n 2 遞推演算法 int f2 int n if n 2 return 1 int...