package endual;

public class AnagramApp {

	static int size ;
	static int count ;
	static char[] arrChar ;

	public static void main(String[] args) {

		String msgs = "abc" ;
		arrChar = msgs.toCharArray() ;
		size = arrChar.length ;
		count = 0 ;

		doAnagrm(size) ;
	}
	
	/**
	 * 求出一个word的全排列
	 * @param newSize
	 */
	public static void doAnagrm(int newSize) { //传入的是字符数组的长度
		
		
		if (newSize == 1) {
			return ;
		}
		
		for (int j=0; j<newSize; j++) { //对数组进行循环确保每个都能当头头轮的到
			
			doAnagrm(newSize-1) ;
			if(newSize == 2) {
			    displayWord() ;
			}
			rotate(newSize) ; //进行调换位子
		}
	}


	//循环左边所有的字符从这个位子到结束
	private static void rotate(int newSize) {
		// TODO Auto-generated method stub
		
		int j ;
		int position = size - newSize ; //总的长度 - 当前字符的长度就是当前位子
		                                //"abcde"---5个 当前位子0 -- a
		                                //"bcde" ---4个当前位子1 -- b
		char temp = arrChar[position]; //保存第一个字母
		for (j=position+1; j < size; j++) { //从当前位子的下一个位子开始
			//移动位子// 原来的是  []bcde --- []cde[空的位子]
			arrChar[j-1] = arrChar[j] ;
		}//跳出循环以后,j的大小是size的大小
		
		arrChar[size-1] = temp ; //将[空的位子] 用temp来代替了
	} // end


	//打印单词
	private static void displayWord() {
		// TODO Auto-generated method stub
		
		if(count < 99) {
			System.out.print(" ") ;
		}
		if (count < 9) {
			System.out.print(" ") ;
		}
		System.out.print(++count + " ") ;
		for (int i=0; i < size; i++) {
			System.out.println(arrChar[i]) ;
		}//打印数列		
		System.out.println("   ");
		System.out.flush() ;
		if(count%6 == 0) {
			System.out.println(" ");
		}
	}
}

 

这是递归应用的另外一种情况。
在这种情况下递归提供了一种对问题的简单简洁的解决方法。排列是指按照一定的顺序安排事物。
假设想要列出一个指定的单词的所以变位子,也就是列出该词的全排列(不管这些排列是否是真的英语单词),
他们都是由原来这个单词的字母组成的。我们称这一的工作是变位一个单词或者称为全排列一个单词。