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