# 函式
日期:114/06/14
---
## 函式是什麼?
**函式(Function)** 是一段可以重複使用的程式碼,
用來完成特定的任務。
---
## 函式的語法
#### 💡 定義函式:
```python
def 函式名稱(參數):
# 函式內容
return 回傳值
````
#### 💡 呼叫函式:
```python
函式名稱(實際參數)
```
---
## 範例:
定義函式:
```python
def say_hello(name):
print(f"Hello, {name}!")
```
呼叫函式:
```python
say_hello("Alice")
```
---
# 回傳值
---
#### 藉由`return`可以將函數執行結果回傳
#### 回傳值可以被儲存、列印
```python
def say_hello(name):
b = f"Hello, {name}!"
return b
```
```python
n = say_hello("Alice") #儲存回傳值
```
```python
print(say_hello("Alice")) #印出回傳值
```
---
## 函式的優點
* 讓程式結構更清晰
* 易於維護與除錯
---
## 遞迴函式是什麼?
**遞迴函式(Recursive Function)**
函式在定義中呼叫自己。
---
## 遞迴函式的特點
* 包含 **終止條件** (避免無限呼叫)
* 每次呼叫都將問題規模縮小
---
## 遞迴範例:階乘
* 定義:所有小於等於該數的正整數的積
* 例:5! = 5 × 4 × 3 × 2 × 1 = 120
```python
def factorial(n):
if n == 1: # 終止條件
return 1
else:
return n * factorial(n - 1)
```
呼叫:
```python
print(factorial(5)) # 輸出:120
```
---
## 遞迴範例:費式數列
<span style="font-family: 'Courier New', monospace;">一般項:a<sub>n</sub> = a<sub>n-1</sub> + a<sub>n-2</sub> (n≥3)</span>
#### `1、 1、 2、 3、 5、 8、 13、 21、 34`
```python
def fibonacci(n):
if n <= 1: # 終止條件
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(5)) #將函數代入5
```
輸出:
```python
5 #得到第5項為5
```
---
<img src="https://hackmd.io/_uploads/HkJD1PqXxg.png" width="80%">
---
## 遞迴要小心什麼?
⚠️ 沒有終止條件會造成 **無限遞迴**
⚠️ 遞迴層數過多可能造成 **堆疊溢位(Stack Overflow)**
(也就是超出記憶體的容量)
---
```python
def f():
f()
f() # 會造成 Stack Overflow
```
---
## 隨堂練習
### [`i322.` 經典河內塔](https://zerojudge.tw/ShowProblem?problemid=i322)
---

---
#### 提示:
<img src="https://hackmd.io/_uploads/B1VUIai7ex.jpg" width="80%">
{"title":"函式與遞迴簡報","lang":"zh-TW","slideOptions":"{\"theme\":\"sky\",\"transition\":\"zoom\",\"slideOptions\":{\"spotlight\":{\"enabled\":true}}}","contributors":"[{\"id\":\"b831f9fa-52bb-4a09-bfbb-148e4fdadd0f\",\"add\":3233,\"del\":1243}]","description":"作者:Ethan","showTags":"true"}