设R={r1,r2,r3,....,rn}是要进行排列的n个元素,Ri=R - {ri}.集合X中元素的全排列 记为perm(X).(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀ri,得到的排列。 R的全排列可归纳如下定义如下: 当n=1时,perm(R)=perm(r),其中r是集合R中的唯一元素。 当n>1时,perm(R)的全排列可由(r1)perm(R1),(r2)perm(R2),....,(rn)perm(Rn)构成。 依此定义,可产生计算集合R的全排列的算法如下: public static void perm(Object []list,int k,int m) { //产生list[k,m]的所有排列 if (k == m) { //单元素序列 for (int i = 0; i <= m; i++) System.out.print(list[i]); System.out.println(); } else { //多元素序列,递归产生排列 for (int i = k; i <= m; i++) { MyMath.swap(lisk,k,i); perm(list,k+1,m); MyMath.swap(list,k,i); } } } PS:集合的全排列运用的是分治思想。即把一个问题分成若干个子问题。在子问题解决的基础上,原问题也就 可以解决了。在这个例子中,集合的数学定义对算法的产生起到了关键性的作用。

评论