递归实现求解幂集问题

Posted on 2020-10-12 19:45  黑炽  阅读(631)  评论(0编辑  收藏  举报

幂集,就是一个集合的所有子集,包括空集

下面附着代码,具体实现的过程代码下面:

各部分代码如下:

 

首先是 headF.h(headFile的意思)

 1 #pragma once
 2 
 3 #include<cstdio>
 4 #include<vector>
 5 
 6 using namespace std;
 7 
 8 extern vector<vector<int>> ps;//存放幂集
 9 
10 void Insertion(int i);//向幂集ps中的每个集合元素添加i 并插入到ps中
11 void powerset(int i, int n);//求1~n的幂集ps
12 void printPowerset();//输出幂集

之后是 headF.cpp

 1 #include "headF.h"
 2 
 3 vector<vector<int>> ps;
 4 
 5 void Insertion(int i) {
 6     vector< vector<int> > ps1;//子幂集
 7     vector< vector<int> >::iterator it;//幂集迭代器
 8 
 9     ps1 = ps;//ps1存放原来的幂集
10     for (it = ps1.begin(); it != ps1.end(); it++) (*it).push_back(i);//在ps1的每个集合元素的末尾添加i
11     for (it = ps1.begin(); it != ps1.end(); it++) ps.push_back(*it);//将ps1的每个集合元素添加到ps中
12 }
13 
14 void powerset(int i, int n) {
15     if (i <= n) {
16         Insertion(i);//将i插入到现有子集中产生新的子集
17         powerset(i + 1, n);//递归调用
18     }
19 }
20 
21 void printPowerset() {
22     vector< vector<int> >::iterator it;//幂集迭代器
23     vector<int>::iterator sit;//幂集集合元素迭代器
24     int coun = 0;
25 
26     for (it = ps.begin(); it != ps.end(); it++) {
27         printf("{");
28         coun = 0;
29         for (sit = (*it).begin(); sit != (*it).end(); sit++) {
30             if (sit + 1 == (*it).end()) printf("%d", *sit);
31             else printf("%d,", *sit);
32             coun++;
33         }
34 
35         printf("}%d  ", coun);
36     }
37     printf("\n");
38 }

最后一个:

#include "headF.h"

int main() {
    int n = 3;
    vector<int> s;

    ps.push_back(s);
    powerset(1, n);
    printf("1~%d的幂集:\n", n);
    printPowerset();

    return 0;
}

额 其中形式可能有点 不一样的地方,这是因为我为了搞清楚vector是怎么实现的,加的一个计数变量

实现过程:

 

大概就是这样实现的,vector<int> ps 相当于一个一维数组 那么vector< vector<int>>就是一个二维的咯