递归算法就是方法自身直接或者间接地调用到了自身,它是一种写起来很简单,但理解起来不那么简单的算法。
一个功能在被重复地调用,并且运算的结果和上一次的调用有关, 这种时候,可以使用递归。
* 注意:
* 1.递归一定要明确递归结束的条件,否则会栈溢出
* 2.注意解决问题的递归次数,如果次数过多,也会发生栈溢出。
比较经典的例子有斐波那契数列、汉诺塔等,这里我们谈谈递归在File类中的使用。
一、牛刀小试
先看,两个简单的例子来了解递归。
1 public class RecursionDemo { 2 3 public static void main(String[] args) { 4 5 System.out.println(getSum(6));//21 6 toBinary(9);//1001 7 } 8 9 //十进制转换为二进制 10 public static void toBinary(int num){ 11 if(num>0){ 12 toBinary(num/2); 13 System.out.print(num%2); 14 } 15 } 16 17 //连续的加法 18 public static int getSum(int num){ 19 if(num==1) 20 return 1; 21 return num+getSum(num-1); 22 } 23 }
二、File类应用1
练习:列出某目录下的内容(包含子目录中的内容),
即进行深度遍历.并且显示出目录层级。
1 package www.brighten.io; 2 3 import java.io.File; 4 5 public class FileTraversalTest { 6 7 public static void main(String[] args) { 8 //定义目录层级 9 int level=0; 10 //创建要列出的目录 11 File dir=new File("D:\\workplace\\BumpGame\\src"); 12 listAll(dir,level); 13 } 14 15 public static void listAll(File dir, int level) { 16 System.out.println(getSpace(level)+dir.getName()); 17 File[] files=dir.listFiles(); 18 level++; 19 for (int i = 0; i < files.length; i++) { 20 if(files[i].isDirectory()){//如果是目录 21 listAll(files[i], level);//递归 22 } 23 else//如果是文件 24 { 25 //打印出文件的名字,并在文件名前面加上相应目录层级的缩进 26 System.out.println(getSpace(level)+files[i].getName()); 27 } 28 } 29 } 30 /** 31 * 计算不同目录层级的缩进 32 * @param level 目录层级 33 * @return String类型的缩进符号 34 */ 35 public static String getSpace(int level) { 36 StringBuilder space=new StringBuilder(); 37 space.append("|--"); 38 for (int i = 0; i <= level; i++) { 39 space.insert(0, " "); 40 } 41 return space.toString(); 42 } 43 44 }
程序输出如下:
|--src |--com |--wsw |--bump |--Ball.java |--Board.java |--BumpGame.java |--MoveObject.java |--思路
三、File类练习2
练习:删除一个目录。
思路:需要从里向外删除,要进行深度遍历,使用递归算法。
1 package www.brighten.io; 2 import java.io.File; 3 4 public class RemoveDirTest { 5 6 public static void main(String[] args) { 7 8 File dir=new File("C:\\Test"); 9 removeDir(dir); 10 } 11 12 public static void removeDir(File dir) { 13 File[] files=dir.listFiles(); 14 for(File file:files){ 15 if(file.isDirectory()){ 16 removeDir(file); 17 }else{ 18 System.out.println(file+"::"+file.delete());//删除文件 19 } 20 } 21 System.out.println(dir+"::"+dir.delete());//删除内容已经为空的目录 22 } 23 24 }
程序输出如下,可以看出删除的顺序是把目录中的内容依次删除,然后再删掉这个目录,递归下去,最后删除最上一级的目录。
所有做删除结果反馈的语句都显示为“true”,可见目录删除成功。
C:\Test\background.png::true C:\Test\Cell.png::true C:\Test\Test1\L.png::true C:\Test\Test1\O.png::true C:\Test\Test1::true C:\Test\Test2\Test3\I.png::true C:\Test\Test2\Test3\J.png::true C:\Test\Test2\Test3::true C:\Test\Test2::true C:\Test::true
时间: 2024-10-08 23:13:27