11 ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數...

12
1 Ch05 遞遞 遞遞遞遞 遞遞遞 1

Post on 22-Dec-2015

253 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

11

Ch05 遞迴

淡江大學 周清江

1

Page 2: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-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 前言

Page 3: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-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;

}

概念較清楚,但較慢

Page 4: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

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);

}

Page 5: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

5

遞迴範例 ( 參考課本第 5 章及複習 4) 以下請自己練習

計算 2n

計算 費氏數列 利用輾轉相除法求兩整數之最大公因數

我們將說明以下範例 排列組合 (ch5_r_permutation.java) 河內塔 (ch5_r_hanoi.java)

Page 6: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

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 張椅子

Page 7: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

7

主程式: 設定陣列 x 後,呼叫 p.r_permutation(x, 0, x.length-1)

Page 8: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

8

5.4.5 河內塔 ( 問題定義在課本 4.3.4 節 )

Page 9: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

9

Page 10: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

10

Page 11: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

11

由遞迴的觀點

Page 12: 11 Ch05 遞迴 淡江大學 周清江 1. 2 遞迴函數乃是一個自己反覆呼叫自己的函數 一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1)

12