递归算法看起来写法很简单,却常常难以理解。通常来说,递归算法有2个要素。一、递归的初始条件。(当不断的调用自身的时候,达到某一个条件无需再调用自身可输出结果)二、递归的传递方式(调用自身)。
比如阶乘n!=n*(n-1)*...*1=n*(n-1)!
因此可以写出计算阶乘的方法:
- int factorial (int n)
- {
- if(n==0)return 1;
- else
- return n*factorial(n-1);
- }
需要指出的是代码上的精炼不一定会带来执行效率的提高。
我要解决的是一个英文单词的全排列的问题,假设单词中没有重复的字母,例如输入cat,输出cat,atc,tca,cta,tac,act把所有可能的排列都找出来。
使用递归算法,代码与相应的说明 如下:
- package recursive;
- //anagram.java
- //creats anagrams
- import java.io.*;
- /
- public class AnagramApps {
- static int size;
- static int count;
- static char[] arrChar=new char[100];
- public static void main(String[] args)throws IOException
- {
- System.out.print("Enter a word: ");
- String input=getString(); //输入单词
- size=input.length(); //单词长度
- count=0; //单词个数
- for(int j=0;j<size;j++)
- arrChar[j]=input.charAt(j); //字符串单词字符数组保存
- doAnagram(size); //全排列
- }
- /
- public static void doAnagram(int newSize)
- {
- if(newSize==1) //全排列单词长为1时,返回
- return;
- for(int j=0;j<newSize;j++) //非1时,做newSize次循环
- {
- doAnagram(newSize-1); //做newSize-1次全排列
- if(newSize==2)displayWord();
- rotate(newSize); //轮转以遍历
- }
- //我的理解是实际上对一个单词的全排列,从小的单位开始轮转,比如ab,ba,逐渐加入新的字母cab,abc,bca轮转
- //再到cba,bac,acb,每加入一个新的字母后,有新的位置开始,它会针对每一种较短的字母轮转的情况进行乱转,
- }
- /
- public static void rotate(int newSize)
- {
- int j;
- int position=size-newSize;
- char temp=arrChar[position];
- for(j=position+1;j<size;j++)
- arrChar[j-1]=arrChar[j];
- arrChar[j-1]=temp;
- }
- /
- public static void displayWord()//显示单词
- {
- if(count<99)
- System.out.print(" ");
- if(count<9)
- System.out.print(" ");
- System.out.print(++count+" ");
- for(int j=0;j<size;j++)
- System.out.print(arrChar[j]);
- 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;
- }
- }
可以试着输入超过6个字母的单词,看看有什么结果?