问题描述
设计一个递归算法生成n个元素 {r1,r2,…rn}的全排列。
分析
设R={r1,r2,…rn}是要进行排列的n个元素,Ri=R-{ri}。
设集合X中元素的全排列记为perm(X)。
(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。
可分类讨论:
当n=1时,perm( R) = ( r),其中r为集合R中唯一元素
当n>1时,perm( R)由(r1)perm(R1)、(r2)perm(R2)…构成
因此设计如下代码:
#include <iostream>
using namespace std;
//swap起元素交换作用
void Perm(int a[],int k,int m){//k~m的全排列函数
if(k==m){
for(int i=0;i<=m;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}else{
for(int j=k;j<=m;j++){
swap(a[k],a[j]);
Perm(a,k+1,m);
swap(a[k],a[j]);
}
}
}
int main()
{
int a[4] = {1,2,3,4};//假设对1,2,3,4这个集合进行全排列
Perm(a,0,3);
return 0;
}