递归在java语言中的应用.doc_第1页
递归在java语言中的应用.doc_第2页
递归在java语言中的应用.doc_第3页
递归在java语言中的应用.doc_第4页
递归在java语言中的应用.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

递归在java语言中的应用两个小经验1.在定义一个类时,不要随意定义成员变量.除非它是这个类的一个属性或者在类的多个方法中要用到它. 2. public class Test public static void main(String args) byte b = new byte102400*1024; 这是一个简单的程序,在写上传文件的程序时极有可能遇到这个情况.比喻说有一个文件的长度是100M.在读取文件内容时就会这样写byte b = new byte102400*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);elseyueshu(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 Hanonstatic 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 Fileprivate 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(args0); 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 = fsi; 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(args0); 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任务执行的类传递参数,怎么做?这个问题还在探讨 中.请高手指教.四 . 设计模式之访问器模式VisitorVisitor定义作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为.为何使用Visitor?Java的Collection(包括Vector和Hashtable)是我们最经常使用的技术,可是Collection好象是个黑色大染缸,本来有各种鲜明类型特征的对象一旦放入后,再取出时,这些类型就消失了.那么我们势必要用If来判断,如:Iterator iterator = Collection.iterator();while (iterator.hasNext() Object o = iterator.next(); if (o instanceof Collection) messyPrintCollection(Collection)o); else if (o instanceof String) System.out.println(+o.toString()+); else if (o instanceof Float) System.out.println(o.toString()+f); else System.out.println(o.toString();在上例中,我们使用了 instanceof来判断 o 的类型.很显然,这样做的缺点代码If else if 很繁琐.我们就可以使用Visitor模式解决它.如何使用Visitor?针对上例,我们设计一个接口visitor访问者:public interface Visitor public void visitCollection(Collection collection); public void visitString(String string); public void visitFloat(Float float);在这个接口中,将我们认为Collection有可能的类的类型放入其中.有了访问者,我们需要被访问者,被访问者就是我们Collection的每个元素Element,我们要为这些Element定义一个可以接受访问的接口(访问和被访问是互动的,只有访问者,被访问者如果表示不欢迎,访问者就不能访问),我们定义这个接口叫Visitable,用来定义一个Accept操作,也就是说让Collection每个元素具备可访问性.public interface Visitable public void accept(Visitor visitor);好了,有了两个接口,我们就要定义他们的具体实现(Concrete class):public class ConcreteElement implements Visitable private String value; public ConcreteElement(String string) value = string; /定义accept的具体内容这里是很简单的一句调用 public void accept(Visitor visitor) visitor.visitString(this); 再看看访问者的Concrete实现:public class ConcreteVisitor implements Visitor /在本方法中,我们实现了对Collection的元素的成功访问 public void visitCollection(Collection collection) Iterator iterator = collection.iterator() while (iterator.hasNext() Object o = iterator.next(); if (o instanceof Visitable) (Visitable)o).accept(this); public void visitString(String string) System.out.println(+string+); public void visitFloat(Float float) System.out.println(float.toString()+f); 在上面的visitCollection我们实现了对Collection每个元素访问,只使用了一个判断语句,只要判断其是否可以访问.至此,我们完成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论