【问题标题】:Create all possible combinations using a deque and recursion C++使用双端队列和递归 C++ 创建所有可能的组合
【发布时间】:2016-04-13 04:26:29
【问题描述】:

我有一个包含一系列数字 {0, 1, 2, 3, 4, 5, 6} 的双端队列,我正在尝试使用递归创建这些数字的所有可能组合。

这是我当前的代码

void combination(vector<node> &comb, deque<node> &numbers) {

    if (numbers.empty()) {
        for (unsigned int i = 0; i < comb.size(); i++) {
            cout << comb[i].id << " ";
        }
        cout << "\n";
        return;
    }

    comb.push_back(numbers.front());
    numbers.pop_front();
    combination(comb, numbers);
    comb.pop_back();
    combination(comb, numbers);
}

我已经在纸上完成了这个,这是有道理的,但是当我运行它时,这是输出:

0 1 2 3 4 5 6
0 1 2 3 4 5
0 1 2 3 4
0 1 2 3
0 1 2
0 1
0

为什么函数没有打印出所有可能的组合?

另外,这就是我想要使用的 - 一个包含数字的双端队列和一个包含每个组合的向量。

【问题讨论】:

  • 我认为这是为了学校练习或其他学习体验?否则你应该改用std::next_permutation
  • 我正在使用它来实现一个分支定界方法来解决问题。所以,我不能使用next_permutation
  • 另外,您在此处发布的代码无法编译。我假设函数应该被称为permute 而不是combinationcombination.push_back(...) 应该是comb.push_back(...)?
  • @CantrianBear 不是一个有用的答案。如果是这样的话,这个网站就没有意义了。我显然不知道为什么它没有达到我的预期,这是最后的手段。
  • 您通过引用传递numbers。在到达的第一片叶子上,它永远为空()。

标签: c++ recursion


【解决方案1】:

您使用的是通过引用传递,我做了一些小改动,它可以工作

代码:

#include <bits/stdc++.h>
using namespace std;

void combination(vector<int> comb, deque<int> numbers) {

    if (numbers.empty()) {
        for (unsigned int i = 0; i < comb.size(); i++) {
            cout << comb[i] << " ";
        }
        cout << "\n";
        return;
    }

    comb.push_back(numbers.front());
    numbers.pop_front();
    combination(comb, numbers);
    comb.pop_back();
    combination(comb, numbers);
}

int main() {
    // your code goes here
    vector<int> comb;
    deque<int> numbers;
    for(int i = 0;i < 7;i++) numbers.push_back(i);
    combination(comb, numbers);
    return 0;
}

ideone 上的解决方案链接:http://ideone.com/vgukF3

【讨论】:

  • 别人在我的帖子下评论说只有双端队列需要按值传递,但这也是一个很好的答案。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2012-03-22
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多