• 沒有找到結果。

函式

N/A
N/A
Protected

Academic year: 2022

Share "函式"

Copied!
36
0
0

加載中.... (立即查看全文)

全文

(1)

盧政良 台大資訊系

函式

1

Function

(2)

盧政良 台大資訊系

2

函數名稱 f(x) 函數輸入

數學

(3)

盧政良 台大資訊系

3

C++

int max(int x, int y)

函式輸入 回傳值的型態

函式名稱

以max為例

(4)

盧政良 台大資訊系

新的關鍵字:

return

4

(5)

盧政良 台大資訊系

語法1: 函式宣告

小叮嚀:函式實作的位置無差異。

5

語法2: 函式實作

(6)

盧政良 台大資訊系

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)

盧政良 台大資訊系

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)

盧政良 台大資訊系

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)

盧政良 台大資訊系

變數的可視範圍

9

Scope

心法:從變數宣告開始到抱著該變數的右大括弧。

(10)

盧政良 台大資訊系

10

程式錯誤

迴圈內的變數 問: i的可視範圍是?

i會隨迴圈結束後而消失!

(11)

盧政良 台大資訊系

11

修正後

函式內的區域變數

問: i的可視範圍是?

如此一來可以在迴圈之後看到 i。

語法上建議將 i宣告在迴圈之內避免 變數污染!

(12)

盧政良 台大資訊系

12

全域變數

global variable

謎之音:不要濫用全域變數。

const:常數 原因

(13)

盧政良 台大資訊系

13 我問你答

‣ Line 3, 6, 14的 x 是否為同一個箱子?

‣ Line 15印出來的數字為什麼是100?

(14)

盧政良 台大資訊系

14 我問你答

‣ Line 3, 6, 14的 x 是否為同一個箱子?

‣ Line 15印出來的數字為什麼是100?

全域變數

區域變數

區域變數

心法:區域變數會優先於全域變數

(15)

盧政良 台大資訊系

函式多載

15

Overloading

https://en.wikipedia.org/wiki/Function_overloading

(16)

盧政良 台大資訊系

多載規則

前提:函式名稱相同

條件:函式輸入相異

型態相異或數量相異

‣ 注意:與函式的回傳型態無關

16

(17)

盧政良 台大資訊系

17

int main(int argc, char** argv)

main也是一個函式,代表整個程式的 起點。

兩個星星是什麼東⻄?!

我們回頭再看一次主要函式

(18)

盧政良 台大資訊系

18

慣例:回傳 0代表程式正常結束

(19)

盧政良 台大資訊系

19

利用atoi將文字轉成數字

(20)

盧政良 台大資訊系

執行命令: max 5 2

20

(21)

盧政良 台大資訊系

遞迴

21

Recursion

(22)

盧政良 台大資訊系

⼀種不需要迴圈但是可以 創造迴圈效果的⽅法!

22

(23)

盧政良 台大資訊系

23

for and .

n! = n × (n − 1)! n > 0 0! = 1

(24)

盧政良 台大資訊系

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

(25)

盧政良 台大資訊系

後語

‣ 迴圈和遞迴是等價的。

• Turing與他的老師Church有證明。

‣ 但,遞迴要付出額外的成本。

• 即額外的空間和時間。

‣ 事實上,遞迴是有限的,不像是迴圈 可以無窮。

25

迴圈和遞迴的關係

(26)

盧政良 台大資訊系

26

https://stackoverflow.com/

void 註: void表示不回傳值

(27)

盧政良 台大資訊系

堆疊溢位

27

stack overflow

(28)

盧政良 台大資訊系 https://www.bogotobogo.com/cplusplus/images/assembly/memory_diagram.png

28

記憶體配置

(29)

盧政良 台大資訊系 http://icodeit.org/images/2016/05/stackoverflow-oreilly.png

29

(30)

盧政良 台大資訊系

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

(31)

盧政良 台大資訊系

遞迴練習題

倒數計時器: 5 4 3 2 1 0。

計算

‣ 計算兩個正整數的最大公因數。

1 + 2 + 3 + ⋯ + 100 = ?

31

遞迴限定

輾轉相除法

(32)

盧政良 台大資訊系

斐波那契數列

32

維基百科

https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/FibonacciRabbit.svg/2560px-FibonacciRabbit.svg.png

(33)

盧政良 台大資訊系

這樣一來會算非常非常非常久....

https://i.ytimg.com/vi/MJRQzC_eU0A/hqdefault.jpg

33

(34)

盧政良 台大資訊系

34

到底是因為這個問題很難,還是

我們選擇了一個爛的方法?

(35)

盧政良 台大資訊系

35

複雜度

Complexity

問題的難度

(36)

盧政良 台大資訊系

36

Essential?

Accidental?

問題本質上的難度

方法/工具的選擇導致的難度

我們很容易因為選擇了一個爛的方法

導致花了很多不必要花的時間!!!

參考文獻

相關文件

SPCE061A 的開發是通過線上調試器 PROBE 實現的。它既

如果函數是由基本函數所組成,至少需要注意:分式函 數分母會等於 0

[r]

對於給定的一個 x 值,經過某一對應方式後得到「唯一」的 y 值,這種對應方式我們稱 為函數,其中 x 是自變數,y 是應變數。. 而在表

sort 函式可將一組資料排序成遞增 (ascending order) 或 遞減順序 (descending order)。. 如果這組資料是一個行或列向量,整組資料會進行排序。

 MATLAB 程式使用 pass-by-value 的方 式,進行程式與函式間的溝通聯絡,當 程式呼叫函式時, MATLAB

Caption 出現的文字 Enabled 是否有致能 Value

除了之前所提的全域變數和區域變數外,我們在變數 前可以加上 static 修飾字:.