递归算法就是方法自身直接或者间接地调用到了自身,它是一种写起来很简单,但理解起来不那么简单的算法。
一个功能在被重复地调用,并且运算的结果和上一次的调用有关, 这种时候,可以使用递归。
* 注意: * 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::trueC:\Test\Cell.png::trueC:\Test\Test1\L.png::trueC:\Test\Test1\O.png::trueC:\Test\Test1::trueC:\Test\Test2\Test3\I.png::trueC:\Test\Test2\Test3\J.png::trueC:\Test\Test2\Test3::trueC:\Test\Test2::trueC:\Test::true