奧林匹亞資訊班

4/19

講師:吳崇維(wayne)

遞迴

recursion

遞迴 recursion

作為程式語言最難理解的運作模式,我們會用非常多時間來好好理解遞迴的意義

 

我對於遞迴的理解就是

 

理解函式(function)的作用

並將其工作(功能)不斷分配下去

 

遞迴 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

回想:費氏數列

f(x) = f(x-1) + f(x-2)

費式數列~

如下:

1, 1, 2, 3, 5, 8, 13, 21, 34 ...

前兩項都是1,從第三項開始,

都是前兩項的和。

 

如果想像第 i 項的值為 f(i)

e.g. f(1) = 1 ;  f(3) = 2 ; f(5) = 5

 

那麼可以寫出:f(i) = f(i-1) + f(i-2)

func(i) = func(i-1)+func(i-2)

 

試試看寫出遞迴

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

Practice

試寫出一個遞迴函式 func (n)

其作用是回傳1+2+...+n 的值

 

不要直接用迴圈 (for or while)

試試看用函式可以

呼叫自己的概念

Permutation!

Permutation (各種排列組合)

比如說permutation 1,2,3 =>

123

132

213

231

312

321

六種可能

遞迴如何做到permutation ?

先從簡化版開始

作業!

輾轉相除法

 

先前介紹過如何求最大公因數

遞迴可以很好的把這件事情簡化

試著用遞迴好好的寫出來~

 

Hint :

(1)   gcd (a,b) = gcd (b, a%b);

(2)   終止條件是什麼呢~?

FeedBack!

一起努力快樂寫程式吧!

class 4/19 遞迴

By Wayne Wu

class 4/19 遞迴

  • 65