疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

结合File类浅析递归的使用


 

 
递归算法就是方法自身直接或者间接地调用到了自身,它是一种写起来很简单,但理解起来不那么简单的算法。
 
一个功能在被重复地调用,并且运算的结果和上一次的调用有关, 这种时候,可以使用递归。
 
* 注意:
* 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:Testackground.png::true
C:TestCell.png::true
C:TestTest1L.png::true
C:TestTest1O.png::true
C:TestTest1::true
C:TestTest2Test3I.png::true
C:TestTest2Test3J.png::true
C:TestTest2Test3::true
C:TestTest2::true
C:Test::true