我是靠谱客的博主 愤怒大雁,最近开发中收集的这篇文章主要介绍C++实现输出一个集合的全部子集,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在学习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++实现输出一个集合的全部子集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部