N個字母全排列
阿新 • • 發佈:2019-01-28
求 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 在解決交換位置的題目時,交換之後一定要重新換回來,便於接下來的交換,否則會亂。這稱之為 回溯 。類似的還有 八皇后問題、迷宮問題 。