給定集合 A = {a, b, c, d},要求按特定順序生成其冪集(所有子集):
aab, bac, abc, bc, cad, abd, bd, acd, abcd, bcd, cd規律是:每取出一個新元素,將其與已生成的所有子集組合,形成新子集。
這是典型的冪集生成問題。對於 n 個元素,共有 2^n 個子集。可用位運算迭代法或遞歸回溯法實現。
#include <stdio.h>
#include <string.h>
void power_set(char *set, int n) {
int total = 1 << n; // 2^n
for (int mask = 1; mask < total; ++mask) { // 從 1 開始跳過空集
int first = 1;
for (int i = 0; i < n; ++i) {
if (mask & (1 << i)) {
if (!first) printf(""); // 這裡可加分隔符
printf("%c", set[i]);
first = 0;
}
}
printf("\n");
}
}
int main() {
char set[] = {'a','b','c','d'};
power_set(set, 4);
return 0;
}
#include <stdio.h>
#include <string.h>
char set[] = {'a','b','c','d'};
char subset[10];
int n = 4;
void dfs(int idx, int len) {
if (idx == n) {
if (len > 0) {
subset[len] = '\0';
printf("%s\n", subset);
}
return;
}
// 不選當前元素
dfs(idx + 1, len);
// 選當前元素
subset[len] = set[idx];
dfs(idx + 1, len + 1);
}
int main() {
dfs(0, 0);
return 0;
}
冪集生成是經典面試題。位運算法代碼最短、效率最高;遞歸法思路清晰、易擴展(如求和、去重等)。根據場景選擇即可。