遞推演算法是一種比較簡單的演算法,即通過已知條件,利用特定關係得到中間結論,然後得到最後結果的演算法。遞推演算法分為順推和逆推兩種,本章通過幾個典型的例子來說明遞推演算法的應用。
順推法順推法是指從已知條件出發,逐步推算出要解決問題的方法。例子,斐波那契數列、進製轉換等問題都可以利用順推法解決。
斐波那契數列(遞推法)
如果1對兔子每月能生1對小兔子,而每對小兔子在它出生後第3個月,又能開始生一對小兔子,假定在不發生死亡的情況下,由1對兔子開始,1年後能繁殖成多少對兔子。
【定義】
斐波那契數列指的是這樣的乙個數列:
0,1,1,2,3,5,8,13,21,......
這個數列從第三項開始,每一項正好等於前兩項之和。如果設f(n)為該數列的前n項,那麼這句話可以寫成如下形式:
f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2) (n≥2)
顯然這是乙個線性遞推數列。
【演算法思想】
我們將兔子分為3種,大兔子、1個月大的小兔子、2個月大的小兔子、其中,大兔子值的是已經可以生小兔子的兔子,1個月大的兔子是當月出生的兔子,2個月大的兔子是上個月生的兔子。到了第3個月時,2個月大的兔子就能生小兔子了。具體的解決思想如下:
(1)初始時,只有1對出生的小兔子,因此總數為1對。
(2)第1個月時,1個月大的小兔子長成2個月的小兔子但還沒有繁殖能力,因此總數仍為1對。
(3)第2個月時,2個月大的小兔子長成大兔子,已經有繁殖能力,繁殖1對1個月大的小兔子。因此總數為2對。
(4)第3個月時,只有1對大兔子,又繁殖1對1個月大的小兔子;同時上個月繁殖的1個月大的小兔子成長為2個月大的小兔子。因此,總數為3對。
(5)依次類推,具體過程如下圖所示。
從表中不難看出,兔子的總對數分別是1,1,2,3,5,8,13,......構成乙個數列。這個數正好構成斐波那契數列:
(1)初始時,設f0=1,第0個月兔子的總數為1對。
(2)第1個月時,f1=1,第1個月兔子的總數為1對。
(3)第2個月時,兔子總數為f2=f0+f1。
(4)第3個月時,兔子總數為f3=f1+f2。
......
依次類推,第n個月兔子總數f(n)=f(n-1)+f(n-2)。
code
#include#include #define n 12
void main()
結果:
【說明】
這個數列是在中世紀由義大利數學家斐波那契在《算盤全書》中提出的,這個數列的通項公式除了用a_n = a_n-2 + a_n-1表示外,還可以用通項公式表示為:
遞推演算法(順推) 斐波那契數列用C 實現
遞推演算法 遞推演算法是一種簡單的演算法,即通過已知條件,利用特定關係得出中間推論,直至得到結果的演算法。遞推演算法分為順推和逆推兩種。順推法 顧名思義,順推法是指 從已知條件出發,逐步推算出要解決的問題 的方法。這次就先介紹順推法中的乙個典型的例子,斐波那契數列。題目 一般而言,兔子在出生兩個月後...
遞推演算法之斐波那契數列 昆蟲繁殖
問題描述 科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。每對成蟲過x個月每個月產y對卵,每對卵要過兩個月長成成蟲。假設每個成蟲不死,第乙個月只有一對成蟲,且卵長成成蟲後的第乙個月不產卵 過x個月產卵 問過z個月以後,共有成蟲多少對?0 x 20,1 y 20,x z 50 輸入格式...
斐波那契數列的遞迴 遞推演算法比較
公式 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...