问题描述:
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为perm(X)。(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。
//排列问题(递归)
#include <iostream>
using namespace std;
template <typename Type>
void Swap(Type &a, Type &b)
{
Type temp;
temp = a ;
a = b;
b = temp;
}
template <typename Type>
void Perm(Type list[], int k, int m)
{
//产生list[k:m]的所有排列
if(k == m)
{
//只剩下一个元素
for(int i = 0; i <= m; i++)
{
cout<<list[i];
}
cout<<endl;
} else {
//还有多个元素待排列,递归产生排列
for(int i = k; i <= m; i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
int main()
{
int n;
cout<<"请输入需排列数的个数:"<<endl;
cin>>n;
int *a = new int[n];
cout<<"输入排列的数:"<<endl;
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
Perm(a,0,n-1);
delete a;
return 0;
}