无递归的置换

Permutation without recursion?

本文关键字:递归      更新时间:2023-10-16

我试图使用for循环来代替我通常使用的递归,但我发现它比我想象的要困难。有人能告诉我怎么做吗?谢谢!

例如,给定向量2,1,3。应该有六种排列:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

vector<int> simple;
simple.push_back(2);
simple.push_back(1);
simple.push_back(3);

编辑:将顺序从1 2 3改为随机顺序2 1 3

我猜你是在找std::next_permutation():

#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
    std::vector<int> simple{1, 2, 3};
    do
    {
        for (auto e : simple) { std::cout << e << " "; }
        std::cout << std::endl;
    }
    while (next_permutation(simple.begin(), simple.end()));
}

下面是一个实例。

如果您不想从排序向量开始,您可以按以下方式使用std::next_permutation():

#include <iostream>
#include <algorithm>
#include <vector>
constexpr int factorial(int i)
{
    return i == 0 ? 1 : i * factorial(i-1);
}
int main()
{
    std::vector<int> simple{3, 1, 2};
    for (int i = 0; i < factorial(simple.size()); i++)
    {
        std::next_permutation(simple.begin(), simple.end());
        for (auto e : simple) { std::cout << e << " "; }
        std::cout << std::endl;
    }
}

下面是一个实例。

请注意,如果向量的大小在编译时是已知的,就像您的示例中所示,您可以使用std::array而不是std::vector,如本实例所示。