# 函式
## 10/13社課
----
## 函式
包含許多程式碼的一行程式
就像是f(x)
----
當程式中有很多重複的段落
但變數又不同時可以使用函式
能簡潔程式 偵錯時也更容易讀
----
函式的形式be like:
(資料型別)+(函式名稱)+(輸入的變數x,y...)
----
```cpp=
int example1 (int a,int b){
int c =a+b;
return c;
}
```
輸入a,b兩個變數
返回c的值
----
### 遞迴
在函式裡呼叫函式本身的行為就叫遞迴
可以想像成f(x)=f(f(x)+f(x-1))
f(段考範圍)=f(段考範圍)+f(上課沒補充但還是考)
----
如費氏數列(1,1,2,3,5,8,13...)
f(x)=f(x-1)+f(x-2) , f(x)=第x項的數字
----
```cpp=
int example2 (int x){
if (x<=1)return 1; //脫出遞迴
return f(x-1)+f(x-2);
}
int main(){
cout<<f(7)<<"\n";
}
```
f(7)
->f(6)+f(5)
->(f(5)+f(4))+(f(4)+f(3))
----
遞迴在建立陣列、鏈結會經常使用
建立遞迴有可能變成無窮迴圈
使用時需注意實際運行的情況
----
### exit(0)
在函式中如果要強制結束程式可以使用exit函式
``` cpp =
exit(0);
```
----
### Void
不需要回傳值時使用
```cpp=
void welive(){
cout<<"we love, we lie.";
}
int main (){
welive();
}
```
在Void函式中使用return;可跳出函式
----
## 全域和區域變數
----
### 全域與區域
全域指的是從程式開始執行到結束
區域則是指函式的執行期間的範圍
----
假設這是一個完整的程式
(1.標頭檔 2.(int main) 3.(函式) )
從運行開始(最外層的括號)到結束為全域
在(int main) (函式)中則稱區域
----
``` cpp=
for(int i=0;i<10;i++){}
```
這裡的變數 i 也在for這塊區域裡
----
## 全域變數
- 全域變數的有效範圍不是區域,而是整體
- 變數定義在任何函式外面,可被其他函式共用
- 區域變數只可在該函式中被使用
- 全域變數屬於靜態變數 在全域無法修改(區域可)
----
```cpp=
int a=5;
void exp(){
int a;
a=10;
cout<<a;
}
int main(){}
```
輸出為函式中的a=10
----
當全域和區域變數同名時
系統優先讀取區域變數(就近取用)
同區域中不能有相同的變數
---
## 排序函式介紹
sort,greater,less
----
### sort
標頭檔:
``` cpp=
#include <algorithm>
```
----
語法:
``` cpp=
sort(開頭,結尾,辨別函式);
```
----
```cpp=
int a[5]={2,4,8,3,5};
sort (a,a+5);//a0 a1 a2 a3 a4
```
排列(陣列a)到a後面n個位置的數值
預設為由小到大排列
----
### 辨別函式
greater,less
----
``` cpp=
#include<functional>
```
greater<int>由大排到小
less<int>則是由小排到大(預設)
```cpp=
sort (a,a+5,greater<int>());
```
----
## 自定義cmp(判別函式)
```cpp=
bool cmp(a,b){}
```
a,b為同型別
----
由小到大排列
```cpp=
bool cmp(a,b){
return a<b;
//return a>b;由大到小
}
```
判斷a<b是否正確
true 不交換 false 交換
----
### 例題
[a227](https://zerojudge.tw/ShowProblem?problemid=a227)
河內塔問題
可以先以2,3個ring做模擬
----
```cpp=
int hanoi(int n, char a, char b, char c){
if(n==1){
cout << "Move ring "<< 1 << " from " << a << " to " << c << endl;
}
else{
hanoi(n-1, a, c, b);//將上方的盤子移到b
cout << "Move ring "<< n << " from " << a << " to " << c << endl;
//移動最下層的盤子n到c
hanoi(n-1, b, a, c);//從b移動剩下的盤子到c
}
}
int main(){
int n;
while(cin >> n){
hanoi(n, 'A', 'B', 'C');
cout << endl;
}
}
```
----
{"title":"函式","description":"包含許多程式碼的一行程式就像是f(x)","contributors":"[{\"id\":\"f73e3593-2b30-4cf8-89e6-dc544aaab97d\",\"add\":3417,\"del\":954}]"}