Генерация и отображение всех подмножеств рекурсивно C ++ - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь сгенерировать все подмножества из набора {1,2,3} recursivley.Когда я запускаю код, ничего не печатается.Я добавляю элементы в вектор, но печать вектора ничего не дает.Я не печатаю в нужном месте или что-то еще происходит?

#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 голосов
/ 19 октября 2018

Ваша проблема в том, что вектор v в gen является локальным объектом функции, поэтому каждый вызов gen имеет свой собственный v.Это не то, что вам нужно, поскольку вы хотите, чтобы все рекурсивные вызовы заполнялись одинаково v.

У вас есть несколько способов исправить это.Вы можете сделать v статическим, но тогда вы можете вызвать функцию только один раз.Вы могли бы сделать v глобальной переменной, но тогда вам нужно помнить, что нужно вызывать clear() на векторе после каждого запуска gen.Наконец, вы можете создать вспомогательную функцию, которая объявляет вектор и затем передает его в вашу рекурсивную функцию для использования.Это ИМХО является более правильным решением, так как не требует вмешательства пользователя.Это дало бы вам

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;
}
...