【发布时间】:2017-12-11 04:13:55
【问题描述】:
一段时间以来,我一直在尝试想出一种方法来计算单词字符串的所有各种组合。然而,与网络上的大多数组合方法不同,该算法必须产生每个组合,包括所有组合元素都不是一个组合的组合。即,如果我将“Hello”、“New”和“World”组合在一起,我正在寻找的组合是:
HelloNewWorld
HelloNew
HelloWorld
Hello
NewWorld
New
World
我大学的一位教授为此提出了一个快速而肮脏的解决方案,但它使用嵌套的 for 循环。
#include <iostream>
#include <vector>
#include <array>
#include <string>
int main()
{
std::vector<std::array<std::string, 2>> vec(3);
vec[0] = {"Hello", ""};
vec[1] = {"New", ""};
vec[2] = {"World", ""};
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
std::cout << vec[0][i] + vec[1][j] + vec[2][k] << std::endl;
}
正如您可能想象的那样,我想要一种方法来使它实际上有点可用和便携。我知道这可以通过递归实现,我只是不知道如何实现它。最理想的情况是,如果可能的话,我想使这个尾递归,因为计划是计算非常大的组合。递归执行此操作的最佳方法是什么,尾递归是否容易?
【问题讨论】:
-
其中一项要求是它们必须是单词,还是严格的字符组合?
-
我强烈建议您使用 Howard Hinnant 的作品在 C++ 中创建高效的组合库。它们是递归的,但它们快速、便携且易于使用。在这种情况下,使用
std::string s = "ab"; for (size_t i =0; i <= ab.size(); ++i) { for_each_combination(s.begin(), s.begin()+i, s.end(), f); }howardhinnant.github.io/combinations.html -
@M4rc 要求必须是单词。抱歉,我应该在我的帖子中这么说。
-
如果您需要一个真正的 N 级 for 循环(笛卡尔积),可以使用很好的实现。披露:我写了这个:gist.github.com/Alexhuszagh/67efb078a82616ed07529ed97586646a
-
@AlexanderHuszagh Howard Hinnat 的组合库看起来非常有趣,而且您的代码看起来很适合它的功能,但它们都不会给我想要的输出。这两个选项都没有提供与某些组合中缺少的组合元素的组合。这是我知道如何描述它的最好方式。我编辑了我的帖子,希望能澄清我在寻找什么。
标签: c++ for-loop recursion tail-recursion