1. 递归
递归(recursion)做为一种算法在程序设计语言中广泛应用。是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象。
(自己调用自己,有结束条件)
注意:递归时一定要明确结束条件。
数学中递归运算.
对于任何正整数N ,N! (读作N的阶乘)的值定义为1-N(包括N)的所有的整数的成绩.因此3! 就是 3!=3*2*1 =6;
5! 定义为5!=5*4*3*2*1=120
那么整数N 的阶乘 N! 可以表示为
1!=1
N!=N*(N-1)! for N>1
若果N 等于1 那么1的继承就是1,其他所有N! =N*(N-1)!,例如:50!=50*49!
49!=49*48! 48!=48*47! 一直持续到1出现.
如何使用Java程序计算阶乘?
|
public static long recursion( int n) { if (n == 1) { return 1; } else { return n * recursion (n - 1); } } |
1.1. 案例
1,列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可。
2,列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:
第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。
3,列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构,效果如下所示:
|--src
| |--cn
| | |--ittest
| | | |--a_helloworld
| | | | |--HelloWorld.java
| | | |--b_for
| | | | |--ForTest.java
| | | |--c_api
| | | | |--Student.java
|--bin
| |--cn
| | |--ittest
| | | |--i_exception
| | | | |--ExceptionTest.class
| | | |--h_linecount
| | | | |--LineCounter3.class
| | | | |--LineCounter2.class
| | | | |--LineCounter.class
|--lib
| |--commons-io.jar
答案:
案例一:
|
// 1,列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可。 private static void listFile(File file) { File[] listFiles = file.listFiles(); for (File f : listFiles) { if (f.isFile()) { System. out .println(f.getName()); } else if (f.isDirectory()) { System. out .println(f.getName()); listFile (f); } } } public static void main(String[] args) { File file = new File( "c:\\abc" ); listFile(file); } |
案例二
|
// 2,列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格: private static void listFile2(File file, String str) { File[] listFiles = file.listFiles(); for ( int i = 0; i < listFiles. length ; i++) { File f = listFiles[i]; System. out .println(str + f.getName()); if (f.isDirectory()) { listFile2 (f, str + "-" ); } } } public static void main(String[] args) { File file = new File( "c:\\abc" ); String str = "-" ; listFile2(file, str ); } |
案例三:
|
// 列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构 private static void listFile3(File file, String str) { File[] listFiles = file.listFiles(); for (File f : listFiles) { System. out .println(str + f.getName()); if (f.isDirectory()) { listFile3 (f, "| " + str); } } } public static void main(String[] args) { File file = new File( "c:\\abc" ); file = new File( "c:\\day18ide" ); file = new File( "c:\\MyIo" ); str = "|-" ; listFile3(file, str ); } |
1.2. 练习
1,删除一个非空的目录。
2,移动一个非空的目录到另一个地方(剪切)。
3,把File类中的重要方法设计代码测试一遍。
|
// 1,删除一个非空的目录。并加强健壮性 private static void deleteFile(File file) { if (!file.exists()) { System. out .println( "路径不存在" ); return ; } if (!file.isDirectory()) { System. out .println( "不是目录" ); return ; } // 如果当前目录中有子目录和文件,先删除子目录和文件 File[] listFiles = file.listFiles(); for (File f : listFiles) { if (f.isFile()) { f.delete(); } else if (f.isDirectory()) { deleteFile (f); } } // 删除当前目录 file.delete(); } |
练习2:
使用File类的renameTo 方法和递归实现非空目录的剪切.
|
public static void main(String[] args) throws IOException { // 重命名文件(成功) // File src = new File("c:\\aaa.txt"); // File dest = new File("c:\\bbb.txt"); // src.renameTo( dest ); // //移动文件(成功) // File src = new File("c:\\aaa.txt"); // File dest = new File("d:\\aaa.txt"); // src.renameTo( dest ); // 移动一个空目录(失败) // File src = new File("c:\\ aaa "); // File dest = new File("d:\\ aaa "); // System.out.println(src.renameTo( dest )); // 使用File类和递归实现文件的剪切. File src = new File( "c:\\abc" ); File dest = new File( "d:\\" ); cutFile (src, dest); } // 移动一个非空的目录到另一个地方(剪切)。 private static void cutFile(File srcDir, File dest) throws IOException { if (!srcDir.exists() || !dest.exists()) { System. out .println( "指定的源目录或者目标目录不存在" ); return ; } if (!srcDir.isDirectory() || !dest.isDirectory()) { System. out .println( "指定的源目录或者目标目录不是目录" ); return ; } // 得到源目录名 String srcDirName = srcDir.getName(); // abc // 根据源目录名创建新目录名 File destDir = new File(dest + srcDirName); // d:\\ abc dest 为父路径 // srcDirName 为子路径 // 创建目标目录 destDir.mkdir(); // 遍历源目录 File[] listFiles = srcDir.listFiles(); for (File f : listFiles) { // 如果是子源文件,使用renameTo方法,移动至目标目录中(该方法同时会删除源目录中的文件) if (f.isFile()) { f.renameTo( new File(destDir, f.getName())); // 指定目标文件的父目录,文件名(根据源文件名生成). } else if (f.isDirectory()) { // 如果是子目录,执行重复动作. 将源子目录 , 目标目录(父目录+//) cutFile (f, new File(destDir, File. separator )); // 指定源目录,指定目的路径d:\\ abc \\ } } // 删除源目录 srcDir.delete(); } |