概述
在学习C++时遇到的一个问题:用递归实现一个集合全部子集的输出。
一开始感觉好难,虽然个数和思路很好想,有n个元素,就有2n个子集,0表示没有,1表示有。
但是如何用递归代码实现呢?
思路:类似于二进制字符串0表示不在子集中不输出,1表示在子集中可以输出。当所有字符的状态确定时输出子集。然后返回上一次不确定的字符改变它的状态,并让不确定的字符减一直至不确定的字符为0 为基本情况。
方法如下:
#include <iostream>
using namespace std;
//递归实现求一个集合的全部子集
//思路:将字符串中的所有字符的状态看作0或1.
//template <class T>
void subset(int *p,int n,int len){
//基本情况
if (n==0){
int j = 0;
cout<<"{";
for (int i = 0; i < len; ++i) {//用len来控制全部输出字符
if (j!=0&&p[i]!=0){
cout<<",";//控制,的输出
}
if (p[i]!=0){
cout<<p[i];
j++;
}
}
cout<<"}"<<endl;
return;
}
for (int j = 0; j <=1; ++j) {//每个元素都有0和1两种状态
int *ch = new int[len];
for (int i = 0; i < len; ++i) {
ch[i] = p[i];//创建临时数组来储存p的所有值,确保还能输出元素的初始值
}
if (j==0){
ch[n-1] = 0;//0表示元素不在该子集中
}
subset(ch,n-1,len);//判断剩下的n-1个字符是否在子集中
}
}
代码实现很简洁,但是具体实现并不太好想,还是要多练习递归,多看一些大佬的代码。
最后
以上就是愤怒大雁为你收集整理的C++实现输出一个集合的全部子集的全部内容,希望文章能够帮你解决C++实现输出一个集合的全部子集所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复