奧林匹亞資訊班

10/4

講師:吳崇維(wayne)

遞迴

recursion

遞迴 recursion

遞迴最基礎的定義就是在

自己的函式裡面呼叫 (call)自己

 

這樣可以造成同一個函式裡面

不斷去呼叫相同函式的效果。

 

像是看著兩面在前與後的鏡子,會看到無窮多個人,一樣的道理

理解函式:

 

void func(int x);

----------

此函式接收一個整數參數

將整數參數的值印出來

若此值為0 => 回傳 (終止條件)

否則處理func(x-1);

回傳

如果main() call func(2) ...

func(2) 接到一個x=2的參數

func(2) 印出 2 並換行

func(2) call func(1)

func(1) 接到一個x=1的參數

func(1) 印出 1 並換行

func(1) call func(0)

func(0) 接到一個x=0的參數

func(0) 印出 0 並換行

func(0) 進入 if 並且 return;

func(1) return;

func(2) return;

回到main()

遞迴的重重重點

 

一定要有終止條件!!!

一定要有終止條件!!!

一定要有終止條件!!!

 

如果沒有終止條件,就會造成遞迴無限的執行下去

迴圈的終止條件

遞迴的終止條件

遞迴的終止條件

在自己電腦上打看看

記得要按

ctrl + c 或ctrl + z

結束程式XD

差別在哪?影響又是什麼呢?

Practice

先給你一個整數 n 代表陣列長度,再給你陣列值

Ex : 

4

1 2 5 9

 

請你計算有多少種數字可以被這個陣列裡的數字組合出來?

解析: 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15,16, 17  => 15種

-------------------------------------------------------------------------------

Ex : 

3

1 2 3

共有 : 1, 2, 3, 4, 5, 6    =>  6種

Practice!

給你一個整數 n 

請你輸出~

1+2+4+5+7+8+10 ... + n  (3的倍數不加)

並且!

不能使用迴圈指令 : (while, for ... 等等)

只能使用遞迴!

 

Ex : n = 10

       輸出 = 37

Homework!

給你一個整數 n 

請你輸出~

1 + 1+2 + 1+2+3 + 1+2+3+4 + 1+2+3+4+5 ... 的值

並且!

不能使用迴圈指令 : (while, for ... 等等)

只能使用遞迴!

 

Ex : n = 3

       輸出 = 10

Hint : 你可能需要兩種遞迴式

FeedBack!

一起努力快樂寫程式吧!

10/4 遞迴 & more

By Wayne Wu

10/4 遞迴 & more

  • 79