# 函式 日期: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) --- ![解出河內塔移動步驟](https://hackmd.io/_uploads/SkRtvTiQex.jpg) --- #### 提示: <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"}
    100 views