<H1> 單元一 遞迴 </H1> :::success 原理 : 在function裡面**有條件**的呼叫自己。 目的 : 把一個問題拆解成許多小問題,減少寫程式的負擔。 ::: 舉例: Factorial, GCD, Binary Search, Tower of Hanoi... :::info 遞迴四大點: 1.把問題拆解成更小的問題 2.看遞迴的時候有沒有減少問題大小 3.看有沒有Base Case,若沒有,可能會造成**無窮迴圈** 4.所有的Case最後都會到Base Case。 ::: 以下是以遞迴實作GCD的程式碼 ``` int gcd(int x, int y){ if(x<y) gcd(y,x); if(!x%y) return y; else return gcd(y,x%y); } ``` 以下是用遞迴實作Merge Sort的程式碼 ``` void merge(vector<int>&v, int front, int middle, int end){ vector<int> temp; int i,j; i = front; j = middle+1; while(i<=middle && j<=end){ if(v[i]<=v[j]){ temp.push_back(v[i]); i++; } else { temp.push_back(v[j]); j++; } } while(i<=middle){ temp.push_back(v[i]); i++; } while(j<=end){ temp.push_back(v[j]); j++; } for(i = front ; i <= end ; i++){ v[i] = temp[i-front]; } } void mergeSort(vector<int>&v, int front, int end ){ if(front>=end) return; int middle = (front+end)/2; mergeSort(v,front,middle); mergeSort(v,middle+1,end); merge(v,front,middle,end); } ``` :::warning 遞迴缺點 : 會占用較多記憶體空間和 花費較多的CPU時間。 ::: ## 河內塔問題 :::info 有三根杆子A,B,C。A杆上有 N 個 (N>1) 穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至 C 杆: 1.每次只能移動一個圓盤。 2.大盤不能疊在小盤上面。 ::: 以下是神秘的程式碼: ``` void Towers(int n, char source, char dest, char spare ){ if(n==1){ printf("Move top disk from %c to %c", source, dest); } else{ Towers(count-1,source,spare,dest); Towers(1,source,dest,spare); Towers(count-1,spare,dest,source); } } ``` 時間複雜度: O(2^n)