# Đệ 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)$.