---
# System prepended metadata

title: Đệ quy

---

# Đệ quy
## Sinh tập hợp con
Dưới đây là ứng dụng của đệ quy trong việc sinh tập hợp con.
```cpp    
void gen(int k){
    if (k==n+1){
        // process subset
    }
    else{
        subset.push_back(k);
        gen(k+1);
        subset.pop_back();
        gen(k+1);
    }
}
```
Độ phức tạp: $O(2^N)$.
## Sinh hoán vị
Tiếp theo là cách sinh các hoán vị.
```cpp
void gen(){
    if (perm.size()==n){
        // process permutation
    }
    else{
        for (int i=1;i<=n;i++){
            if (chosen[i]){
                continue;
            }   
            chosen[i]=true;
            perm.push_back(i);
            gen();
            chosen[i]=false;
            perm.pop_back();
        }
    }
}
```
Độ phức tạp: $O(!N)$.
## Quay lui
Quay lui bắt đầu với không lời giải sau đó mở rộng nó ra dần. Quay lui sẽ duyệt qua tất cả các phương án giải.
### Bài toán N Quân Hậu
Cho một bàn cờ $n$ x $n$ với $n$ quân hậu. Hỏi có bao nhiêu cách sắp xếp các quân hậu trên bàn cờ sao cho không có hai quân hậu nào tấn công nhau?
```cpp    
void queen(int y){
    if (y==n){
        ans++;
        return;
    }
    for (int x=0;x<n;x++){
        if (col[x]||diag1[x+y]||diag2[x-y+n-1]){
            continue;
        }
        col[x]=diag1[x+y]=diag2[x-y+n-1]=1;
        queen(y+1);
        col[x]=diag1[x+y]=diag2[x-y+n-1]=0;
    }
}
```
Độ phức tạp: $O(!N)$.