五、應用示例——斐波那契數列
注意在最近的學習中,我自己感覺我一開始最不理解的就是乙個方法裡面還可以呼叫這個方法自己,感覺太不可思議了,今天我們就分享一下這種演算法——遞迴演算法
遞迴是電腦科學的乙個重要概念。遞迴演算法就是把問題轉化為規模縮小了的同類問題的子問題,然後遞迴呼叫函式來表示問題的解。乙個函式直接或間接呼叫自己本身,這種函式叫遞迴函式。
1、遞迴就是在過程或函式裡呼叫自己
2、在使用遞迴時,必須有乙個明確的遞迴結束條件,稱為遞迴出口
3、遞迴演算法在演算法中的運用一般都看著比較簡單,但是執行效率較低,在程式中不提倡使用遞迴演算法設計程式
4、在遞迴呼叫的過程中系統為每一層的返回點、區域性變數等其他變數都開闢了棧來儲存。遞迴次數過多容易導致棧溢位,所以不提倡
遞迴演算法所體現的「重複」一般有三個要求:
1、每次呼叫在規模上縮小(通常是減半)
2、相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(即前一次的輸出作為後一次的輸入)
3、在問題的規模極小時,必須直接給出解答,否則就會陷入死迴圈
對於任何正整數n,n!(讀作n的階乘)的值定義為1-n(包括n)的所有整數的階乘積。那麼整數n的階乘n!可以表示為:
1! = 1
n! = n * (n-1)! n>1
1、遞迴過程實際上就是自身呼叫自身,它在呼叫的時候棧是逐步累積的
2、遞迴工程應該是乙個收斂的過程,即規模逐步縮小,直至可以計算出乙個結果
我以輸出5的階乘作為演示
**如下(示例):
public
class
factorial
public
static
intfactorial
(int num)
else
}else
return result;
}}
**如下(輸出):
120
這是乙個經典的問題,斐波那契數列是這樣定義的:
f(0) = 0
f(1) = 1
當n>1時
f(n) = f(n-1)+f(n-2)
斐波那契數列:0,1,1,2,3,5,8,13,21,34,55,89
1、對於當n>2,求f(n)只需求出f(n-1)和f(n-2),也就是規模為n的問題,慢慢的變成更小規模的問題了
2、當n = 0或當 n = 1,存在最簡單的情景(遞迴出口):f(0) = 0, f(1) = 1
輸出第五項菲波那切數列的值為例
**如下(示例):
public
class
fibonacci
public
static
intfibonacci
(int num)
else
if(num ==1)
else
}else
return result;
}}
**如下(輸出):
5
在編寫遞迴呼叫函式的時候,一定要把對簡單情景的判斷寫在最前面,以保證函式呼叫在檢查到簡單情景的時候能夠及時的終止遞迴,否則的話會陷入死迴圈 遞迴演算法斐波那契數列
有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...
階乘 及 斐波那契數列
階乘 乙個正整數的階乘是所有小於及等於該數的正整數的積,並且0的階乘為1。例項學習 public class factorial test public static intfactorial int index else if index 1 else else 執行結果 720斐波那契數列 又稱...
遞迴演算法前置 斐波那契數列
斐波那契數列,又稱 分割數列,指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 在數學上,斐波納契數列以如下被以遞迴的方法定義 f0 0,f1 1,fn f n 1 f n 2 n 2,n n 在現代物理 準晶體結構 化學等領域,斐波納契數列都有直接的應用。學習遞迴演算法的時候一般都會了解...