我正在尝试生成集合{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;
}
答案 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;
}