对于给定的n>=1的集合,需要打印出该集合所有可能的排列。例如,如果这个集合是{a,b,c},那么所有可能得排列是:
1. a b c
2. a c b
3. b c a
4. b a c
5. c a b
6. c b a
即 a 加上{b,c}的所有排列
b 加上{a,c}的所有排列
c 加上{a,b}的所有排列
那么依次类推当 n = 4时{a,b,c,d}排列的就是(只用 a 来说吧,其他同理):
a 加上{b,c,d}的所有排列,
而{b,c,d}的所有排列又可分为(拿b举例,c,d同理):
b 加上 {c,d}的所有排列,
而{c,d}的排列就两种,即{c,d}和{d,c}
所以只要是元素个数是 n>=1 个的集合,都可以用递归的方法一层一层的简化,直至简化至 2 个元素为止(n = 1 除外)
下一步就是交换最后的这 2 个元素,然后再逐级往上加就可以得到该集合所有的不同排列
以下是集合{1,2,3,4}的举例代码:
#include<iostream>
using namespace std;
void Perm(int a[],int k,int n) // k 从 1 开始,n 为元素的个数
{
if(k==n) //输出排列
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else //递归生成这些排列
{
for(int i=k-1;i<n;i++)
{
int t = a[i];
a[i] = a[k];
a[k] = t;
Perm(a,k+1,n);
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}
int main()
{
int a[4] = {1,2,3,4};
Perm(a,1,4);
}
int 也可以换成其他类型