递归求集合的子集

算法与数据结构 专栏收录该内容
17 篇文章 0 订阅

编写递归函数,求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;
}
  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:我行我“速” 设计师:Amelia_0503 返回首页

打赏作者

Joshua_yi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值