1. 程式人生 > >求n個數的排列

求n個數的排列

如果給定N個不同字元,將這N個字元全排列,最終的結果將會是N!種。如:給定 A、B、C三個不同的字元,則結果為:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6種情況。

public class Test6 {

//設定總數
private static int count =0;
public static void main(String[] args) {

//獲取
Scanner s = new Scanner(System.in);
int n = s.nextInt();
Vector<Character> sources = new Vector<Character>();
Vector<Character> results = new Vector<Character>();
//將獲取的資料放入棧
for (int i = 0; i <n; i++) {
sources.add((char) ('A'+i));
}
//呼叫自定義方法,計算總數和輸出結果
count(sources, results);

//輸出符合排列的總數
System.out.println(count);
}
public static void count(Vector<Character> v1,Vector<Character> v2){

//如果v1的長度為0就輸出結果因為資料已經全部取出
if(v1.size()==0){
for (int i = 0; i < v2.size(); i++) {
System.out.print(v2.elementAt(i));
}
System.out.print("\n");
count++;
return;
}
for (int i = 0; i < v1.size(); i++) {
//設定兩個快取棧,用於回撥函式是作為引數
Vector<Character>tsourse=new Vector<Character>(v1);
Vector<Character>tresult=new Vector<Character>(v2);
//將剩餘的數依次新增進向量中
tresult.add(v1.elementAt(i));

//並移除佇列中的當前元素
tsourse.remove(i);

//回撥函式
count(tsourse, tresult);
}
}
}

 

 

注:主要考察的是遞迴

如果需要輸出的是含重複的資料是可以改為

public static void count(Vector<Character> v1,Vector<Character> v2){
if(v2.size()==v1.size()){
for (int i = 0; i < v2.size(); i++) {
System.out.print(v2.elementAt(i));
}
System.out.print("\n");
count++;
return;
}
 for (int i = 0; i < v1.size(); i++) {
//設定兩個快取棧
Vector<Character>tsourse=new Vector<Character>(v1);
Vector<Character>tresult=new Vector<Character>(v2);
//當
System.out.println(i);
tresult.add(v1.elementAt(i));
//tsourse.remove(i);
count(tsourse, tresult);
}
}