如何以非递归形式重写此函数?
void generate(int pos)
{
if (pos == n + 1)
{
print_table();
}
else
{
for (int i = 1; i <= n; i++)
{
if (!used[i])
{
used[i] = true;
perm[pos] = i;
generate(pos + 1);////recursion
used[i] = false;
}
}
}
}
答案 0 :(得分:2)
对于数字1,...,n的每个排列,此代码似乎调用print_table()
。在C ++中有一个内置的工具。
#include <algorithm>
void generate() {
int n = 10; // or whatever
std::vector<int> perm(n);
for(int i=0; i<n; i++) perm[i] = i+1;
do {
print_table(perm);
} while(std::next_permutation(perm, perm+n));
}
答案 1 :(得分:1)
您的代码似乎是一个标准的递归算法,用于生成元素列表的所有排列。您可能希望查看迭代算法以列出列表的所有排列,而不是尝试将递归算法机械地按到迭代算法(可能需要某种堆栈)。例如,C ++提供了std::next_permutation
算法,您可以使用该算法列出排列。作为参考,我有a simple implementation of this algorithm以及解释它是如何工作的评论。
希望这有帮助!