11 ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數...
Post on 22-Dec-2015
253 views
TRANSCRIPT
11
Ch05 遞迴
淡江大學 周清江
1
2
遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法
n! = n * (n-1)! = n * (n-1) * (n-2)!
= n * (n-1) * (n-2) * (n-3)!
= …
= n * (n-1) * (n-2) * (n-3) * … * (n-(n-2)) * (n-(n-1))
= n * (n-1) * (n-2) * (n-3) * … * 2 * 1
1. 階乘函數一直自己呼叫自己,且引數依序由
n 、 n-1 、 n-2 …、 逐次遞減。
2. 當引數等於 1 時停止遞迴呼叫。
5.1 前言
3
遞迴與非遞迴之比較
//--------------------------------------
// n 階層函數,採用遞迴演算法//--------------------------------------
long factorial (int n)
{
if (n == 1)
return 1;
else
return n * factorial(n-1);
}
//-------------------------------------
// n 階層函數,採用 for 迴圈//-------------------------------------
long factorial (int n)
{
long f = 1;
for(int i = n; i > 1; i--)
f = f * i;
return f;
}
概念較清楚,但較慢
4
5.2 如何設計遞迴程式1. 確定函數名稱2. 確定函數參數及其型
別 ( 含傳回值的部份 )
3. 確定何時遞迴呼叫4. 確定遞迴呼叫時之引
數值5. 確定何時終止遞迴呼
叫 ( 即直接 return)6. 確定遞迴呼叫時之回
傳值
//--------------------------------------
// n 階層函數,採用遞迴演算法//--------------------------------------
long factorial (int n)
{
if (n == 1)
return 1;
else
return n * factorial(n-1);
}
5
遞迴範例 ( 參考課本第 5 章及複習 4) 以下請自己練習
計算 2n
計算 費氏數列 利用輾轉相除法求兩整數之最大公因數
我們將說明以下範例 排列組合 (ch5_r_permutation.java) 河內塔 (ch5_r_hanoi.java)
6
5.4.3 排列組合
( 基礎 ) 先讓 a 、 b 、 c 分別 坐 1 、 2 、 3 號椅子
當 a 坐 1 號椅子, b, c 坐 2, 3 號椅子有 2 種坐法 ( 遞迴 ) 當 a 坐 2 號椅子, b, c 坐 1, 3 號椅子有 2 種坐法 ( 遞迴 )當 a 坐 3 號椅子, b, c 坐 1, 2 號椅子有 2 種坐法 ( 遞迴 )
:
::::::
:
可將此做法擴充至 4 張椅子
7
主程式: 設定陣列 x 後,呼叫 p.r_permutation(x, 0, x.length-1)
8
5.4.5 河內塔 ( 問題定義在課本 4.3.4 節 )
9
10
11
由遞迴的觀點
12