是否可以仅使用迭代器输出1,...,n的排列?

时间:2010-09-07 11:18:28

标签: algorithm iterator permutation

这里有几个伪代码示例来说明我的意思。

这产生组合(忽略顺序而不重复的选择)1,...,n一次取3个。

Do[Print[i,j,k], {i,1...n-2}, {j,i+1...n-1}, {k,j+1...n}]

循环从左到右工作---对于每个i,迭代器j将遍历其值,对于每个j,迭代器k将通过它。通过添加更多变量并更改n,我们可以概括上述内容。

问题:我们可以对排列做同样的事情吗?换句话说,我们能找到一种方法来调整迭代器以产生P(n,k)= n!/(p-k)! 1,...,n的排列?对于k = 3,

Do[Print[i,j,k], {i, f_1 , g_1(i,n)}, {j, f_2(i), g_2(i,j,n)}, {k, f_3(i,j), g_3(i,j,k,n)}]

仅使用基本的算术运算和模块算术,地板/天花板fcns等。

因为这可能闻起来像是一个家庭作业问题,我会选择“yay”或“nay”的答案;你对难度等级的估计对我也有帮助。

谢谢。

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用std::next_permutation中的<algorithm>

至少任何STL实现的源代码都应该为您提供答案。

编辑:http://compprog.wordpress.com/tag/permutation/是一个简单的教学答案。

答案 1 :(得分:1)

你的意思是迭代地生成排列,没有递归吗?是的,这是可能的:

http://en.wikipedia.org/wiki/Permutation

请参阅“生成排列的算法”部分

1. Find the largest index k such that a[k] < a[k + 1]. If no such index exists, the permutation is the last permutation.
2. Find the largest index l such that a[k] < a[l]. Since k + 1 is such an index, l is well defined and satisfies k < l.
3. Swap a[k] with a[l].
4. Reverse the sequence from a[k + 1] up to and including the final element a[n].

这遵循你的限制只使用基本算术运算(如果你不喜欢交换,知道你可以通过使用加法和减法交换两个数字)。