遞迴解決全排列問題

Kunaly發表於2018-03-15
排列:從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列;
全排列:當n==m時,稱為全排列;

假設:集合{ 1,2,3}的全排列為:
{ 1 2 3} 
{ 1 3 2 }
{ 2 1 3 }
{ 2 3 1 }
{ 3 2 1 }
{ 3 1 2 }


我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為{1,2,3}的排列列舉樹,此樹和我們這裡介紹的演算法完全一致;



演算法思路:
(1)n個元素的全排列=(n-1個元素的全排列)+(另一個元素作為字首);
(2)出口:如果只有一個元素的全排列,則說明已經排完,則輸出陣列;
(3)不斷將每個元素放作第一個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;

package test;

public class Perm {

	public static void perm(Object[] 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 i=k;i<=m;i++){
				list = MyMath.swap(list,k,i);   //for迴圈將陣列從頭到尾的每一個數一次放到最前面
			    perm(list,k+1,m);    //確定第一個元素,開始遞迴k+1到結束的數
			    list = MyMath.swap(list, k, i);  //還原換過的數
			}
		}
	}
	
	public static void main(String[] args) {
		
	    Object[] list = {1,2,3};
	    perm(list, 0, 2);
		
	}
	
}
package test;

public class MyMath {

	//調換list中k和i下表元素的值
	public static Object[] swap(Object[] list, int k, int i) {
		// TODO Auto-generated method stub
		Object temp = list[k];
		list[k]=list[i];
		list[i]=temp;
		return list;
	}

}




相關文章