如何以非递归形式重写此函数?

时间:2014-01-06 20:33:24

标签: c++ recursion

如何以非递归形式重写此函数?

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

2 个答案:

答案 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以及解释它是如何工作的评论。

希望这有帮助!