C++实现输出一个集合的全部子集

C++ 同时被 2 个专栏收录
10 篇文章 0 订阅
2 篇文章 0 订阅

在学习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个字符是否在子集中

    }
    

}

代码实现很简洁,但是具体实现并不太好想,还是要多练习递归,多看一些大佬的代码。

  • 3
    点赞
  • 1
    评论
  • 13
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值