package org.chinasoft.iterator; public class Test2 { public static void main(String[] args) { System.out.println(iterator(5)); } public static int iterator(int c) { if(c == 1) { return 1; //递归的结束条件 } else { return c * iterator(c-1); } } } 目标:理解什么是递归
递归使用时要注意的地方(如何防止出现死递归现象)
理解递归与循环的区别
能够画出递归调用的示意图
要求:能够在应用上熟练使用递归,掌握递归的调用形式
递归(recursion):迭代
递归列出某个文件目录下的所有文件和目录
示例代码:IteratorTest1.java package org.chinasoft.iterator; import java.io.File; import java.io.IOException; /** * 递归列出某个文件目录下的所有文件和目录 * @author lilei * */ public class IteratorTest1 { /** * 为了研究代码本身对异常直接抛出不做任何处理 * @param args 输入参数列表 * @throws IOException 抛出的可能的异常类对象 */ public static void main(String[] args) throws IOException { String s = "f:" + File.separator + "a"; iterator(s); } public static void iterator(String s){ File file = new File(s); File[] fileNames = file.listFiles(); for(File f : fileNames) { if(f.isDirectory()) { iterator(f.toString()); } if(f.isDirectory()) { System.out.println("--------------folders---------------"); } else { System.out.println("---------------files----------------"); } System.out.println(f.getName()); } } } 示例代码:IteratorTest2.java package org.chinasoft.iterator; import java.io.File; import java.io.IOException; /** * 递归列出某个文件目录下的所有文件和目录 * @author lilei * */ public class IteratorTest2 { /** * 为了研究代码本身对异常直接抛出不做任何处理 * @param args 输入参数列表 * @throws IOException 抛出的可能的异常类对象 */ public static void main(String[] args) throws IOException { String s = "f:" + File.separator + "a" + File.separator; iterator(s); } public static void iterator(String s){ File file = new File(s); String[] fileNames = file.list(); for(String f : fileNames) { File temp = new File(s + File.separator + f); File fs = new File(temp.toString()); if(fs.isDirectory()) { iterator(fs.toString()); } System.out.println(f); } } } 递归调用的示意图: 当函数直接或者间接调用自己时,则发生了递归 递归时要给定一个递归条件,否者会产生死递归现象。
要求:使用递归种一棵文件树
package org.chinasoft.iterator; import java.io.File; import java.io.IOException; /** * 根据目标路径,构建一棵文件树 * @author lilei * */ public class FileListCopy { public static String sep = File.separator; //路径分隔符 public static String path1 = "f:" + sep + "a" + sep; //源路径 public static String path2 = "f:" + sep + "b" + sep; //目标路径 private static int level; //用来标识构建的是否是第一层的路径(是否是文件树的根),通过此层次来构建目标字符串的结构 /** * 通过源路径来构建目标路径 * 所有的异常均不做处理,向外抛出 * @param source 源路径 * @param destination 目标路径 * @throws IOException 可能抛出的异常 */ public static void copyFileList(String source, String destination) throws IOException { File f = new File(source); //创建源文件树的对象 File[] fileNames = f.listFiles(); //拿到源路径下的孩子 for(File fs : fileNames) { //根据源路径来构建目标路径 File temp = null; //需要动态创建的文件或目录的File对象的引用 if(fs.isDirectory()) { if(level == 0) { temp = new File(destination + sep + fs.getName()); level++; } else { temp = new File(destination + sep + fs.getName()); } temp.mkdirs(); copyFileList(fs.toString(), temp.toString()); } if(fs.isFile()) { temp = new File(destination + sep + fs.getName().toString()); temp.createNewFile(); } } } /** * 程序的入口 * @param args 输出参数的列表项 * @throws IOException 可能抛出的异常 */ public static void main(String[] args) throws IOException { copyFileList(path1, path2); } }
使用递归打印5的阶乘:
package org.chinasoft.iterator; public class Test1 { static int n = 1; public static void main(String[] args) { System.out.println(iterator(5)); } public static int iterator(int c) { if(c > 1) { n *= c*(c-1); iterator(c-2); } return n; } }
posted on 2010-10-24 19:27 freehell 阅读(170) 评论(0) 编辑 收藏 举报
Powered by: 博客园 Copyright © 2024 freehell Powered by .NET 9.0 on Kubernetes