递归在java语言中的应用


一 . 两个小经验
  1.在定义一个类时,不要随意定义成员变量.除非它是这个类的一个属性或者在类的多个方法中要用到 它.

  2.
   public class Test  {
      public static void main(String[] args)  {
         byte[] b = new byte[102400*1024];
      }
   }
   这是一个简单的程序,在写上传文件的程序时极有可能遇到这个情况.比喻说有一个文件的长度是100M.  在读取文件内容时就会这样写byte[] b = new   byte[102400*1024],但是在运行时会出一个内存越界错误.在实际应用中一定要非常小心.
 
二 . 递归:
  先看一个小例子:
    public class Recursion {
       public static void func() {
          func();
       }
       public static void main(String[] args)  {
          func();
       }
    }
  上面就是一个简单的递归程序,运行一定会把内存吃光,所以在使用递归时一定要加上特定的条件
  
  下面再看几个递归的例子.
  (1) .
  public class YueShuTest { 
   //求最大公约数
     public static void yueshu(int num1,int num2) {
         if(num1 == num2) {
            System.out.println (num1);
         }
        else  {
            yueshu(Math.abs(num1 - num2),Math.min(num1,num2));
        }
   }
 
   //求二进制
   public static void binary(int num) {
       if(num > 0) {
          binary(num / 2);
          System.out.print (num % 2);
       }
    }  
  }
  下面在看一个最经典的汉诺塔问题(很复杂的一个问题).
  public class Hanon {
     static void hanon(int n,char a,char b,char c) {
         if(n == 1) {
            move(1,a,c);
            return;
        }  
        hanon(n - 1,a,c,b);
        move(n,a,c);
        hanon(n - 1,b,a,c); 
     }
   
     static void move(int n,char a,char c) {
         System.out.println (n + ":" + a + "-->" + c);
      }
   
      public static void main(String[] args) {
         hanon(3,'A','B','C');
      }
 }
 看看,一个多么复杂的问题这么几行代码就搞定了.递归的威力无穷啊!
 再来看一个更复杂的.
  import java.io.*; 
  class FileWrapper extends File {
    private boolean bLast = false;
    private FileWrapper parent = null;
    public FileWrapper(File f,boolean bLast,FileWrapper parent) {
      super(f.getPath());
      this.parent = parent;
      this.bLast = bLast;
    }
   
    public FileWrapper getMyParent() {
     return parent;
    }
   
   public boolean isLast() {
     return bLast;
    } 
  }
  
  
  public class FileTree{
   //第一种方法.
    /*public static String makeSpaces(int level) {
    StringBuffer sbf = new StringBuffer();
    for (int i = 0; i < level; i++)
       {
        sbf.append("   ");
       }
       return sbf.toString();
   }
   
   public static void listFile(File f,int level)
   {
    if(!f.exists())
    {
     System.out.println ("该文件不存在!");
     return;
    }
    
    System.out.println (makeSpaces(level) + f.getName());
    if(f.isDirectory())
    {
     File[] fs = f.listFiles();
     for(File file : fs)
     {
      listFile(file,(level + 1));
     }
    }
   }
   
   public static void main(String[] args)
      {
       File file;
       if(args.length < 1)
       {
        file = new File(".");
       }
       else
       {
        file = new File(args[0]);
       }
       listFile(file,0);
      }
   */
   这段代码打印出来的结果如下:
   
   //第二种方法
      public static void listFile(FileWrapper fw)
      {
       if(!fw.exists())
       {
        System.out.println ("该文件不存在!");
        return;
       }
       
       System.out.println (makePrefix(fw) + fw.getName());
       if(fw.isDirectory())
       {
        File[] fs = fw.listFiles();
           for (int i = 0 ;i < fs.length;i++)//File fl : fs)
           {
            File f1 = fs[i];
            FileWrapper fw1 = null;
            if(i == fs.length - 1)
            {
             fw1 = new FileWrapper(f1,false,fw);
            }
            else
            {
             fw1 = new FileWrapper(f1,true,fw);
            }
               listFile(fw1);
           }
           
       }       
      }
     
      public static void main(String[] args)
      {
       File file;
       if(args.length < 1)
       {
        file = new File(".");
       }
       else
       {
        file = new File(args[0]);
       }
       FileWrapper fw = new FileWrapper(file,true,null);
       listFile(fw);
      }
     
      public static void makeParentPrefix(FileWrapper fw,StringBuffer prefix)
      {
       if(fw.getMyParent().getMyParent() == null)
       {
        return;
       }
       
       FileWrapper parent = fw.getMyParent();
       if(parent.isLast())
       {
        prefix.append("  │"); 
       }
       else
       {
        prefix.append("    ");
       }
       
       makeParentPrefix(parent,prefix);
      }
     
      public static String makePrefix(FileWrapper fw)
      {     
       if(fw.getMyParent() == null)
       {
          return "";
       }
       
       StringBuffer sbf = new StringBuffer();
       if(fw.isLast())
       {
        sbf.append("─├");
       }
       else
       {
        sbf.append("─└");
       }
       
       makeParentPrefix(fw,sbf);
       sbf.reverse();
       return sbf.toString();
      }
  }
  这段代码打印出来的结果如下:


三 . 要在执行ant的命令行窗口中给build.xml中的java任务执行的类传递参数,怎么做?这个问题还在探讨中...请高手指教.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值