奧林匹亞資訊班
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