1. 程式人生 > >C++利用遞迴生成子集

C++利用遞迴生成子集

利用遞迴生成子集是遞迴的一個簡單應用,主要思路是通過一個bool陣列來標識一個元素是否在生成的子集內,從而輸出所有子集。
下面的程式可以實現這個功能,空集直接不輸出,元素間用空格隔開。

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

const int MAX = 10;

template<class T>
void Subset(T list[],bool exists[], int k, int m)
{//list 全集,exists 判斷是否存在於子集內,k 遞迴層數,m 遞迴終點
if(k == m-1) { //當達到終點時輸出,按照exists[i]是否為0判斷是否在集合內 int i = 0; exists[k] = 0; for(i=0; i<m-1; i++) if(exists[i]) cout << list[i] << ' '; if(exists[i]) cout << list[i]; cout << endl; exists[k] = 1; for
(i=0; i<m-1; i++) if(exists[i]) cout << list[i] << ' '; if(exists[i]) cout << list[i] << endl; return; } exists[k] = 0;//定義list[k]不在子集內 Subset(list,exists,k+1,m); exists[k] = 1;//定義list[k]在子集內 Subset(list,exists,k+1,m); } int main() { char
ch[MAX]; bool exists[MAX] = {0}; int i = 0; while(i<MAX){ cin.get(ch[i]); if(ch[i] == ' ' || ch[i] == '\n') break; i++; } Subset(ch,exists,0,i); }

通過對每個元素賦兩種值(0,1),得到所有解的情況。