盧政良 台大資訊系
函式
1
Function
盧政良 台大資訊系
2
函數名稱 f(x) 函數輸入
數學
盧政良 台大資訊系
3
C++
int max(int x, int y)
函式輸入 回傳值的型態
函式名稱
以max為例
盧政良 台大資訊系
新的關鍵字:
return
4
盧政良 台大資訊系
語法1: 函式宣告
小叮嚀:函式實作的位置無差異。
5
語法2: 函式實作
盧政良 台大資訊系
6
int main() { int i = 5;
int j = 3;
int k = max(i, j);
std"::cout "<< k "<< std"::endl;
return 0;
}
int max(int x, int y) { if (x > y) {
return x;
} else {
return y;
} }
函式堆疊
5 3 i
j k
函式空間#1
步驟 1 / 3
i 和 j 被複製一份 到另外一個空間
呼叫max
Pass-by-value
Function Stack
堆疊是一種資料結 構,性質是先進後 出 (or 後進先出)。
盧政良 台大資訊系
7
int main() { int i = 5;
int j = 3;
int k = max(i, j);
std"::cout "<< k "<< std"::endl;
return 0;
}
int max(int x, int y) { if (x > y) {
return x;
} else {
return y;
} }
函式堆疊
5 3 i
j k
函式空間#1
步驟 2 / 3
待って
5 y 3
x 函式空間#2
答案要回傳給main
盧政良 台大資訊系
8
int main() { int i = 5;
int j = 3;
int k = max(i, j);
std"::cout "<< k "<< std"::endl;
return 0;
}
int max(int x, int y) { if (x > y) {
return x;
} else {
return y;
} }
函式堆疊
5 3 5
i j k
函式空間#1
步驟 3 / 3
接續
函式走完流程之後,用過的空間會被釋放!
盧政良 台大資訊系
變數的可視範圍
9
Scope
心法:從變數宣告開始到抱著該變數的右大括弧。
盧政良 台大資訊系
10
程式錯誤
迴圈內的變數 問: i的可視範圍是?
i會隨迴圈結束後而消失!
盧政良 台大資訊系
11
修正後
函式內的區域變數
問: i的可視範圍是?
如此一來可以在迴圈之後看到 i。
語法上建議將 i宣告在迴圈之內避免 變數污染!
盧政良 台大資訊系
12
全域變數
global variable
謎之音:不要濫用全域變數。
const:常數 原因
盧政良 台大資訊系
13 我問你答
‣ Line 3, 6, 14的 x 是否為同一個箱子?
‣ Line 15印出來的數字為什麼是100?
盧政良 台大資訊系
14 我問你答
‣ Line 3, 6, 14的 x 是否為同一個箱子?
‣ Line 15印出來的數字為什麼是100?
全域變數
區域變數
區域變數
心法:區域變數會優先於全域變數
盧政良 台大資訊系
函式多載
15
Overloading
https://en.wikipedia.org/wiki/Function_overloading
盧政良 台大資訊系
多載規則
‣ 前提:函式名稱相同
‣ 條件:函式輸入相異
• 型態相異或數量相異
‣ 注意:與函式的回傳型態無關
16
盧政良 台大資訊系
17
int main(int argc, char** argv)
main也是一個函式,代表整個程式的 起點。
兩個星星是什麼東⻄?!
我們回頭再看一次主要函式
盧政良 台大資訊系
18
慣例:回傳 0代表程式正常結束
盧政良 台大資訊系
19
利用atoi將文字轉成數字
盧政良 台大資訊系
執行命令: max 5 2
20
盧政良 台大資訊系
遞迴
21
Recursion
盧政良 台大資訊系
⼀種不需要迴圈但是可以 創造迴圈效果的⽅法!
22
盧政良 台大資訊系
23
for and .
n! = n × (n − 1)! n > 0 0! = 1
盧政良 台大資訊系
24
招式拆解
factorial(4) = 4 x factorial(3)
= 3 x factorial(2)
= 2 x factorial(1)
= 1 x factorial(0)
= 1
去
回
https://pic.pimg.tw/rubeelittle/1538093672-3745203256.jpg
盧政良 台大資訊系
後語
‣ 迴圈和遞迴是等價的。
• Turing與他的老師Church有證明。
‣ 但,遞迴要付出額外的成本。
• 即額外的空間和時間。
‣ 事實上,遞迴是有限的,不像是迴圈 可以無窮。
25
迴圈和遞迴的關係
盧政良 台大資訊系
26
https://stackoverflow.com/
void 註: void表示不回傳值
盧政良 台大資訊系
堆疊溢位
27
stack overflow
盧政良 台大資訊系 https://www.bogotobogo.com/cplusplus/images/assembly/memory_diagram.png
28
記憶體配置
盧政良 台大資訊系 http://icodeit.org/images/2016/05/stackoverflow-oreilly.png
29
盧政良 台大資訊系
30
https://www.designer-daily.com/wp- content/uploads/2017/10/9YSKS0C.jpg
https://www.designer-daily.com/wp- content/uploads/2017/10/99KoRNR.jpg
https://i.redd.it/4vgo5urck9mz.jpg
盧政良 台大資訊系
遞迴練習題
‣ 倒數計時器: 5 4 3 2 1 0。
‣ 計算
‣ 計算兩個正整數的最大公因數。
1 + 2 + 3 + ⋯ + 100 = ?
31
遞迴限定
輾轉相除法
盧政良 台大資訊系
斐波那契數列
32
維基百科
https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/FibonacciRabbit.svg/2560px-FibonacciRabbit.svg.png
盧政良 台大資訊系
這樣一來會算非常非常非常久....
https://i.ytimg.com/vi/MJRQzC_eU0A/hqdefault.jpg
33
盧政良 台大資訊系
34
到底是因為這個問題很難,還是
我們選擇了一個爛的方法?
盧政良 台大資訊系
35
複雜度
Complexity
問題的難度
盧政良 台大資訊系