文字の全配置


昨日また学友は面接に行って私に文字の全配列の问题について闻いて、ネット上で既成の答えがあって、しかし理解するのはやはりとても骨が折れます.
これは再帰すべきであることは明らかだ.毎回1つのアルファベットを出して、残りのアルファベットを再帰的に全配列します.まず、次のコードを貼り付けます.
package cn.tzy;

public class LetterOrder {
	//    
	public static void main(String[] args) {
		char buf[] = { 'a', 'b', 'c'};
		permutate(buf, 0, buf.length - 1);
	}

	public static void permutate(char[] buf, int start, int end) {
		if (start == end) {
			//                  ,           
			for (int i = 0; i <= end; i++) {
				System.out.print(buf[i]);
			}
			System.out.println();
		} else {
			//       
			for (int i = start; i <= end; i++) {
				char temp = buf[start];//     i         start  
				buf[start] = buf[i];
				buf[i] = temp;
				/*
				 *  i  1   ,        ,i  start,   start  end,           。   i  i          abc。
				 *     acb。
				 * */
				
				permutate(buf, start + 1, end);//           

				temp = buf[start];//         
				buf[start] = buf[i];
				buf[i] = temp;
			}
		}
	}
}

このコードを見て、最初はコードの詳細に陥らないで、再帰の全過程を理解しなければなりません.実は全体の過程は3つのステップに分けられます:①i番目の要素をstart位置に置く②残りの要素を全配列する③i番目の要素を元の位置に戻す.毎回i番目の要素をstart位置に置くのは、後ろの要素を全配列することです.これが交換するたびにstart+1になる理由です.