算法分析递归之集合的全排列问题
基于算法分析与设计——以大学生程序设计竞赛为例这本书中的第三章3.1.2集合的全排列问题
本题提出的问题是要解决n个元素的n!中排列方式,设R={r1,r2,···rn},令Ri=R-{ri}。集合的全排列记为perm(X),
则(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),···,(rn)perm(Rn)构成。
本问题采用java语言进行解决的代码如下:
public class suanfa_3_3 {
public void Perm(int list[],int k,int m) {
if(k==m) {
for(int i=0;i<=m;i++)
System.out.print(list[i]);
System.out.println();
}
else {
for(int j=k;j<=m;j++) {
swap(list,k,j);
Perm(list, k+1, m);
swap(list,k,j);
}
}
}
public void swap(int[] list,int x,int y) {
int temp;
temp=list[x];
list[x]=list[y];
list[y]=temp;
}
public static void main(String[] args) {
suanfa_3_3 ss=new suanfa_3_3();
int[] list= {1,2,3,4,5,6};
ss.Perm(list, 0, 3);
}
}
此问题的解决的本质在于,先通过一个循环将n个数中的第一个数进行固定,然后进行递归,
每进行一次递归就固定下来一个数,直到还剩下最后一个数时,进行交换,并且输出,然后
再一步步的返回。
例如:数组list[]={1,2,3,4,5,6},则调用Perm(list,0,3)就是产生元素1-4的全排列。