标签:st3 png 栈溢出 理解 mil 深度遍历 nbsp traversal 递归算法
递归算法就是方法自身直接或者间接地调用到了自身,它是一种写起来很简单,但理解起来不那么简单的算法。
一个功能在被重复地调用,并且运算的结果和上一次的调用有关, 这种时候,可以使用递归。
* 注意:
* 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
标签:st3 png 栈溢出 理解 mil 深度遍历 nbsp traversal 递归算法
原文地址:http://www.cnblogs.com/wsw-tcsygrwfqd/p/6606617.html