# 函式 ## 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}]"}
    157 views