递归生成和显示所有子集C ++

时间:2018-10-18 21:15:28

标签: c++ recursion

我正在尝试生成集合{1,2,3}递归的所有子集。但是,当我运行代码时,什么也没打印。我在向量中添加了元素,但打印向量却没有任何帮助。我不是在正确的位置打印还是发生其他情况?

#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;

int n=3;

void gen(int k) {
    vector<int> v;
    if (k == n + 1) {
        cout <<"(";
        for (auto i = v.begin(); i != v.end(); ++i){
            cout << *i ;
        }
        cout <<")";
    }
    else {
        gen(k + 1);
        v.push_back(k);
        gen(k + 1);
        v.pop_back();
    }
}

int main(){
    gen(1); 
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的问题是v中的向量gen是函数局部对象,因此对gen的每次调用都有自己的v。这不是您想要的,因为您希望所有递归调用都填充相同的v

您有几种方法可以解决此问题。您可以将v设为静态,但是之后只能调用一次该函数。您可以将v设置为全局变量,但是每次运行clear()之后,都需要记住先调用gen,然后再调用vector。最后,您可以创建一个帮助程序函数,该函数声明向量,然后将其传递给递归函数以使用。由于不需要用户干预,因此此恕我直言是更正确的解决方案。那会给你

void gen(int k, std::vector<int>& v) {
    if (k == n + 1) {
        cout <<"(";
        for (auto i = v.begin(); i != v.end(); ++i){
            cout << *i ;
        }
        cout <<")";
    }
    else {
        gen(k + 1, v);
        v.push_back(k);
        gen(k + 1, v);
        v.pop_back();
    }
}

void gen(int k) {
    vector<int> v;
    gen(k, v);
}

int main(){
    gen(1);
    return 0;
}