---
# System prepended metadata

title: Untitled

---


<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)



