基于java的数据结构学习手记10-使用递归算法做字母单词全排

       递归算法看起来写法很简单,却常常难以理解。通常来说,递归算法有2个要素。一、递归的初始条件。(当不断的调用自身的时候,达到某一个条件无需再调用自身可输出结果)二、递归的传递方式(调用自身)。

      比如阶乘n!=n*(n-1)*...*1=n*(n-1)!

因此可以写出计算阶乘的方法:

Code:
  1. int factorial (int n)  
  2. {  
  3.    if(n==0)return 1;  
  4. else   
  5.    return n*factorial(n-1);  
  6. }  

       需要指出的是代码上的精炼不一定会带来执行效率的提高。

        我要解决的是一个英文单词的全排列的问题,假设单词中没有重复的字母,例如输入cat,输出cat,atc,tca,cta,tac,act把所有可能的排列都找出来。

        使用递归算法,代码与相应的说明 如下:

Code:
  1. package recursive;  
  2. //anagram.java  
  3. //creats anagrams  
  4. import java.io.*;  
  5. /  
  6. public class AnagramApps {  
  7.     static int size;    
  8.     static int count;  
  9.     static char[] arrChar=new char[100];  
  10.     public static void main(String[] args)throws IOException  
  11.     {  
  12.         System.out.print("Enter a word: ");  
  13.         String input=getString();                 //输入单词  
  14.         size=input.length();                      //单词长度  
  15.         count=0;                                  //单词个数  
  16.         for(int j=0;j<size;j++)                     
  17.           arrChar[j]=input.charAt(j);             //字符串单词字符数组保存  
  18.         doAnagram(size);                          //全排列  
  19.     }  
  20. /  
  21.     public static void doAnagram(int newSize)  
  22.     {  
  23.         if(newSize==1)                           //全排列单词长为1时,返回  
  24.             return;  
  25.         for(int j=0;j<newSize;j++)               //非1时,做newSize次循环  
  26.         {                                           
  27.             doAnagram(newSize-1);                //做newSize-1次全排列  
  28.             if(newSize==2)displayWord();           
  29.             rotate(newSize);                     //轮转以遍历  
  30.         }  
  31.         //我的理解是实际上对一个单词的全排列,从小的单位开始轮转,比如ab,ba,逐渐加入新的字母cab,abc,bca轮转  
  32.         //再到cba,bac,acb,每加入一个新的字母后,有新的位置开始,它会针对每一种较短的字母轮转的情况进行乱转,  
  33.           
  34.     }  
  35. /  
  36.     public static void rotate(int newSize)  
  37.     {  
  38.         int j;  
  39.         int position=size-newSize;  
  40.         char temp=arrChar[position];  
  41.         for(j=position+1;j<size;j++)  
  42.         arrChar[j-1]=arrChar[j];  
  43.         arrChar[j-1]=temp;  
  44.     }  
  45. /  
  46.     public static void displayWord()//显示单词  
  47.     {  
  48.         if(count<99)  
  49.             System.out.print(" ");  
  50.         if(count<9)  
  51.             System.out.print(" ");  
  52.         System.out.print(++count+" ");  
  53.         for(int j=0;j<size;j++)  
  54.             System.out.print(arrChar[j]);  
  55.         System.out.print(" ");  
  56.         System.out.flush();  
  57.         if(count%6==0)System.out.println(" ");  
  58.     }  
  59. /  
  60.     public static String getString()throws IOException  
  61.     {  
  62.         InputStreamReader isr=new InputStreamReader(System.in);  
  63.         BufferedReader br=new BufferedReader(isr);  
  64.         String s=br.readLine();  
  65.         return s;  
  66.     }  
  67.       
  68.       
  69.       
  70.       
  71.       
  72.       
  73.       
  74.       
  75.       
  76. }  

  可以试着输入超过6个字母的单词,看看有什么结果?

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值