import java.io.*;
public class AnagramApp {
static int size;
static int count;
static char[] ch=new char[100];
public static void main(String[] args) throws IOException{
System.out.println("Input a word:");
String s=getString();
size=s.length();
count=0;
for(int i=0;i<size;i++){
ch[i]=s.charAt(i);
}
doAnagram(size);
}
public static void doAnagram(int n){
if(n==1)
return;
for(int i=0;i<n;i++){ //向前移动n-1次,循环n次
doAnagram(n-1);
if(n==2){
display();
}
rotate(n);
}
}
public static void rotate(int n){ //把最后的字母向前移动n-1位
int j;
int position=size-n;
char temp=ch[position];
for(j=position+1;j<size;j++)
ch[j-1]=ch[j];
ch[j-1]=temp;
}
public static void display(){
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.print(ch[i]);
}
System.out.print(" ");
System.out.flush();
if(count%6==0)
System.out.println();
}
public static String getString() throws IOException{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
return s;
}
}
这个递归程序的主要部分有两个:
1、doanagram函数
public staticvoid doAnagram(intn){
if(n==1)
return;
for(inti=0;i<n;i++){ //向前移动n-1次,循环输出n次
doAnagram(n-1);
if(n==2){
display();
}
rotate(n); //n=2时,rotate每次都要执行两次,相当于没有rotate,同理,n=3,也要移动三次,相当于没有移动
} //所以3,7处的字符是csta和astc,而非ctsa和tsac
}
当输入cast时:参数n=2时,最后两位交换显示,n=3时, 把最后的字母向前移动n-1位,更换最后两位char,然后再次最后两位交换并输出,然后再此重复操作,总共有3*2=6次。表现为上图的1~6的字符。2、rotate函数:
public staticvoid rotate(intn){
//size-n处的元素移动到最后
int j;
intposition=size-n;
chartemp=ch[position];
for(j=position+1;j<size;j++)
ch[j-1]=ch[j];
ch[j-1]=temp;
}