《2022年递归在java语言中的应用 .pdf》由会员分享,可在线阅读,更多相关《2022年递归在java语言中的应用 .pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、递归在 java 语言中的应用两个小经验 1.在定义一个类时,不要随意定义成员变量.除非它是这个类的一个属性或者在类的多个方法中要用到它 . 2. public class Test public static void main(String args) byte b = new byte102400*1024; 这是一个简单的程序,在写上传文件的程序时极有可能遇到这个情况.比喻说有一个文件的长度是 100M. 在读取文件内容时就会这样写byte b = new byte102400*1024, 但是在运行时会出一个内存越界错误 .在实际应用中一定要非常小心. 二 . 递归 :先看一个小例子
2、: public class Recursion public static void func() func(); public static void main(String args) func(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - 上面就是一个简单的递归程序,运行一定会把内存吃光,所以在使用递归时一定要加上特定的条件下面再看几个递归的例子. (1) . public class YueShuTest /
3、求最大公约数 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
4、 - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 下面在看一个最经典的汉诺塔问题(很复杂的一个问题). 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 +
5、 - + c); public static void main(String args) hanon(3,A,B,C); 看看 ,一个多么复杂的问题这么几行代码就搞定了.递归的威力无穷啊! 再来看一个更复杂的. import java.io.*; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - class FileWrapper extends File private boolean bLast = false; priv
6、ate 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 makeSpac
7、es(int level) StringBuffer sbf = new StringBuffer(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - 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
8、.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) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精
9、心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - file = new File(.); else file = new File(args0); listFile(file,0); */ 这段代码打印出来的结果如下: /第二种方法public static void listFile(FileWrapper fw) if(!fw.exists() System.out.println ( 该文件不存在!); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
10、 - - - - 第 6 页,共 13 页 - - - - - - - - - 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 = n
11、ew FileWrapper(f1,true,fw); listFile(fw1); public static void main(String args) File file; if(args.length 1) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 13 页 - - - - - - - - - file = new File(.); else file = new File(args0); FileWrapper fw = new FileWrapper(
12、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); 名师资料总结 - - -精品资
13、料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 13 页 - - - - - - - - - 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.re
14、verse(); return sbf.toString(); 这段代码打印出来的结果如下: 三 . 要在执行 ant 的命令行窗口中给build.xml 中的 java 任务执行的类传递参数,怎么做 ?这个问题还在探讨中.请高手指教 . 四 . 设计模式之访问器模式Visitor Visitor 定义名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 13 页 - - - - - - - - - 作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定
15、义作用于这些对象的新操作. 在 Java 中,Visitor 模式实际上是分离了collection 结构中的元素和对这些元素进行操作的行为. 为何使用Visitor? Java 的 Collection( 包括 Vector 和 Hashtable)是我们最经常使用的技术,可是 Collection 好象是个黑色大染缸 ,本来有各种鲜明类型特征的对象一旦放入后,再取出时 ,这些类型就消失了.那么我们势必要用 If 来判断 ,如: Iterator iterator = Collection.iterator(); while (iterator.hasNext() Object o = it
16、erator.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 el
17、se if 很繁琐 .我们就可以使用Visitor 模式解决它 . 如何使用Visitor? 针对上例 ,我们设计一个接口visitor 访问者 : public interface Visitor public void visitCollection(Collection collection);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 13 页 - - - - - - - - - public void visitString(String string);
18、 public void visitFloat(Float float); 在这个接口中 ,将我们认为Collection 有可能的类的类型放入其中. 有了访问者 ,我们需要被访问者,被访问者就是我们Collection 的每个元素Element,我们要为这些 Element 定义一个可以接受访问的接口(访问和被访问是互动的,只有访问者 ,被访问者如果表示不欢迎, 访问者就不能访问), 我们定义这个接口叫Visitable,用来定义一个Accept 操作 ,也就是说让Collection 每个元素具备可访问性 . public interface Visitable public void a
19、ccept(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 实
20、现 : public class ConcreteVisitor implements Visitor 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 13 页 - - - - - - - - - /在本方法中 ,我们实现了对Collection 的元素的成功访问public void visitCollection(Collection collection) Iterator iterator = collection.iterator() while (itera
21、tor.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 每个元素访问 ,只使用了一个判断语句,
22、只要判断其是否可以访问. 至此 ,我们完成了Visitor 模式基本架构. 使用 Visitor 模式的前提对象群结构中 (Collection) 中的对象类型很少改变,也就是说访问者的身份类型很少改变,如上面中 Visitor 中的类型很少改变,如果需要增加新的操作,比如上例中我们在ConcreteElement 具体实现外 , 还需要新的ConcreteElement2 ConcreteElement3. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 13 页 - - - - - - - - - 可见使用 Visitor 模式是有前提的,在两个接口Visitor 和 Visitable 中,确保 Visitor 很少变化 ,变化的是 Visitable,这样使用Visitor 最方便 . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 13 页 - - - - - - - - -