集合全排列问题
设集合 R={ r1,r2,r3 … r n},显然全排列的数目为 n!。
那么如何显示集合的所有全排列呢?
可以用递归的方式实现。
解题思路
如果集合有n个元素,那么就可以看作 n-1个元素全排列之后再加上 剩下的那个元素,因为是全排列,所以每一个元素都会剩下一次。(例如:
R={1,2,3}的全排列。
若 1 剩下,则 {2,3} 先进行排列,再与1结合,结果是 1 23,1 32。
若 2 剩下,则{1, 3}排列,与2结合,结果是 2 13, 2 31。
若 3,结果为 3 12 , 321。)
继续,n-1 个数的全排列又可以看作 n-2 个数的全排列,再与剩下的那个数结合。这就与刚刚的操作重复了,一层层的往下简化,直到最后,数列中只剩下了1个元素,递归就结束了。
来看具体实现
//定义一个数组,表示集合
//参数k为起始排列数的下标,m为结束下标。
void Perm(int list[], int k, int m)
{
if(k==m) //递归结束标志,起始下标=结束下标,代表集合内就一个数了。
{
for(int i=0;i<=m;i++)
cout<<list[i]<<" "; //此时数组内的元素已经被交换好位置,一种排列可以输出。
cout<<e