这里有几个伪代码示例来说明我的意思。
这产生组合(忽略顺序而不重复的选择)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”的答案;你对难度等级的估计对我也有帮助。
谢谢。
答案 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].
这遵循你的限制只使用基本算术运算(如果你不喜欢交换,知道你可以通过使用加法和减法交换两个数字)。