1. 程式人生 > >N個字母全排列

N個字母全排列

求 n個元素的全排列。利用遞迴的方式實現。

題目分析

例如對 abc 進行全排列,則所有結果為:
abc acb bac bca cab cba
分析易知:分別把各個字母放在首字母位置,然後其他的所有字母進行全排列, 這就有了構造的相似性,也就可以使用遞迴的思想。

public class N個元素全排列 {
    public static void main(String[] args) {
        char[] c = "ABCDE".toCharArray();
        f(c, 0);
    }

    /**
     * 遞迴實現n個元素的全排列
     * 
     * @param
c * 陣列名 * @param k * 當前的交換位置,與其後的元素交換 */
private static void f(char[] c, int k) { // 注意: 程式的出口由for迴圈控制 for (int i = k; i < c.length; i++) { char temp = c[k]; c[k] = c[i]; c[i] = temp; f(c, k + 1
);// 遞迴呼叫 // 回溯 // 交換完之後一定要換回原始資料,否則後邊的交換就會變亂 temp = c[k]; c[k] = c[i]; c[i] = temp; } // 輸出 if (k == c.length) {// 換完一輪之後列印結果 for (char d : c) { System.out.print(d + " "); } System.out.println(); } } }

總結

1 構造遞迴時,引數k是關鍵, 遞迴的關鍵是構造相似性(相似非相同),若沒有這個引數k,那麼遞迴長度不會變,就會變成死迴圈,所以要多一個引數。
2 在解決交換位置的題目時,交換之後一定要重新換回來,便於接下來的交換,否則會亂。這稱之為 回溯 。類似的還有 八皇后問題、迷宮問題