---
# System prepended metadata

title: 遞迴的應用

---

# 遞迴的應用

## Permutation 排列
給n個相異的數字，其排列的方法數為$n!$

```
// chosen[i] == 1 -> i 被選過了
// chosen[i] == 0 -> i 沒被選過了
int chosen[] = {};
int queue[] = {};

int permutation(int n, int x) {
    // n個人排隊，已經排好x個
    if(n == x) {
        for(int i=1;i<=n;++i)
            cout << queue[i] << " ";
        cout << endl;
        return;
    }
    else {
        for(int i=1;i<=n;++i) {
            if(chosen[i] != 1) {
                queue[x+1] = i;
                chosen[i] = 1;
                permutation(n, x+1);
                chosen[i] = 0;
            }
        }
    }
}

int main() {
    permutation(5, 0);
}
```

### Exercise
http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=b038

## Choose $k$ out of $n$ （作業）

Exampe: $n=4$ and $k=2$
Then you should output 
```
1 2
1 3
1 4
2 3
2 4
3 4
```
作法
```
int ans[10];
void choose(int n, int i, int k, int x) {
    // k 是目標選幾個
    // x 是目前選幾個
    // n 是總共有幾個數字
    // i 是目前看第幾個數字
    if(k == x || i == n+1) {
        if(k == x) {
            for(int j=0;j<k;++j) {
                cout << ans[j] << " ";
            }
            cout << endl;
        }
        return;
    }
    else {
        // 先選
        ans[x] = i;
        choose(n, i+1, k, x+1);
        // 再不選
        choose(n, i+1, k, x);
    }
}

```


## Brute-force $2^n$ possibilities

### Exercise
http://infor.ylsh.ilc.edu.tw/JudgeOnline/problem.php?id=1027


```
int solve(int n, int i, int sum) {
    // i 是目前看第幾個數字
    // n 是總共有幾個數字
    // sum 是已選的數字的總和
}
```
