递归求集合的子集

编写递归函数,求n个元素集合的所有子集。不妨令集合元素为小写字母,原集合为{‘a’, ‘b’, …, ‘a’ + n - 1}。

输入:input.txt,仅包含整数n(1-26)。
输出:若输入合法,输出集合的所有子集;否则输出“WRONG”。子集输出格式为每行一个子集,空集用空行表示,非空集合每个元素间用一个空格间隔,最后一个元素之后不能有空格。例如,对n=3,可能的输出为:
―――――――――――
a
a b
a b c
a c
b
b c
c
――――――――――――-


代码如下

#include<iostream>
#include<cmath>
using namespace std;

// 判断某个字母是否在此子集内
void printSet(char*characters, int n, int a[],int i,int j) {
	if (j > n - 1)return;
	else {
		if (i & a[j] && j != n - 1)	cout << characters[j] << " ";
		if (j==n-1&&i&a[n - 1]) cout << characters[n - 1];
	}
	printSet(characters, n, a, i, j + 1);
}

// 一个集合一个集合的判定子集元素并输出
void SubSet(char*characters, int n,int a[]) {
	for (int i = 0; i < pow(2, n); i++) {
		printSet(characters, n, a, i, 0);
		cout << endl;
	}
}

int main(){
	char characters[26];
	int a[26];
	characters[0] = 'a';
	a[0] = 1;
	// 初始化字母
	for (int i = 1; i < 26; i++)
	{
		characters[i] = 'a' + i;
		a[i] =a[0]<<i;
	}
	
	int n;
	cin >> n;
	
	if (n<1||n > 26)cout << "WRONG";
	else
	SubSet(characters, n,a);
	return 0;
}
发布了40 篇原创文章 · 获赞 57 · 访问量 2754

猜你喜欢

转载自blog.csdn.net/weixin_44984664/article/details/105129803