1. 程式人生 > >演算法分析遞迴之集合的全排列問題

演算法分析遞迴之集合的全排列問題

基於演算法分析與設計——以大學生程式設計競賽為例這本書中的第三章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的全排列。