子集生成
问题:输出$[0,1,2,3,...n)$的所有子集。 1. 增量构造法:一次选出一个元素放到集合中。由于$A$中的元素个数不确定,每次递归调用都要输出当前集合。另外,递归边界也不需要显示确定——如果无法继续添加元素,自然就不会递归了。 void print_subset(int n, int* A, int cur){ for(int i = 0; i < cur; i++) printf("%d ", A[i]); printf("\n"); int s = cur ? A[cur - 1] + 1 : 0; for(int i = s; i < n; ++i){ A[cur] = i; print_subset(n, A, cur + 1); } } 2. 位向量法:构造一个位向量$B[i]$,而不是直接构造子集$A$本身,其中$B[i]=1$,当且仅当$i$在子集$A$中。 void print_subset1(int n, int* B, int cur){ if(cur == n){ for(int i = 0; i < cur; ++i) if(B[i]) printf("%d ", i); printf("\n"); return; } B[cur] = 1; print_subset1(n, B, cur + 1); B[cur] = 0; print