递归:函数的自身调用函数的自身
递归的使用前提:必须要有结束条件的情况下调用。
package com.cn.recursion;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年8月2日19:56:37
* Desc:
递归:函数的自身调用函数的自身
递归的使用前提:必须要有结束条件的情况下调用。
案例:算出5的阶乘。 5! = 5 * 4 * 3 * 2 * 1
*/
public class Demo1 {
public static void main(String[] args) {
/* int result = factorial1(5);
System.out.println(result);*/
int result = factorial2(5);
System.out.println(result);
}
/**
* 方式1
* 需求:算出5的阶乘。 5! = 5 * 4 * 3 * 2 * 1
* @return
*/
public static int factorial1(int num){
int result = 1;
while(num > 0){
result = result*(num--);
}
return result;
}
/**
* 方式2 递归
* 需求:算出5的阶乘。 5! = 5 * 4 * 3 * 2 * 1
* @param num
* @return
*/
public static int factorial2(int num){
if(num == 1){
return 1;
}else if(num < 0){
throw new RuntimeException("参数不能为负数");
}else{
// return num*factorial2(num--); //× 5*5*55*5*55*5*55*5*5......
return num*factorial2(--num); //5*4*3*2*1
}
}
}
案例1:列出一个文件夹的子孙文件与目录。
案例2:列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:
第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。
案例3:列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构,效果如下所示:
|--src
| |--cn
| | |--itcast
| | | |--a_helloworld
| | | | |--HelloWorld.java
| | | |--b_for
| | | | |--ForTest.java
| | | |--c_api
| | | | |--Student.java
|--bin
| |--cn
| | |--itcast
| | | |--i_exception
| | | | |--ExceptionTest.class
| | | |--h_linecount
| | | | |--LineCounter3.class
| | | | |--LineCounter2.class
| | | | |--LineCounter.class
|--lib
| |--commons-io.jar
案例4:删除一个非空的文件夹。
案例5:剪切一个非空目录。 (见下一个笔记,《剪切(使用File类的renameTo 方法和递归实现非空目录的剪切)》)
package com.cn.recursion;
import java.io.File;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年8月2日21:36:36
* Desc:
案例1:列出一个文件夹的子孙文件与目录。
案例2:列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:
第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。
案例3:列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构,效果如下所示:
|--src
| |--cn
| | |--itcast
| | | |--a_helloworld
| | | | |--HelloWorld.java
| | | |--b_for
| | | | |--ForTest.java
| | | |--c_api
| | | | |--Student.java
|--bin
| |--cn
| | |--itcast
| | | |--i_exception
| | | | |--ExceptionTest.class
| | | |--h_linecount
| | | | |--LineCounter3.class
| | | | |--LineCounter2.class
| | | | |--LineCounter.class
|--lib
| |--commons-io.jar
案例4:删除一个非空的文件夹。
案例5:剪切一个非空目录。
*/
public class Demo2 {
public static void main(String[] args) {
File dir = new File("f:/a");
//测试1
// listFile(dir);
//测试2
// listFile2(dir, "");
//测试3
// listFile3(dir, "|--");
//测试4
// deleteFile(dir); //使用此方法注意,会删除文件,不要随意删除。
}
/**
* 列出一个文件夹中的所有子孙文件与目录
* @param file
*/
public 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);
}
}
}
/**
* 案例2:列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:
* 第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。
* @param file
*/
public static void listFile2(File file, String space){
File[] listFiles = file.listFiles();
for(File f : listFiles){
if(f.isFile()){
System.out.println(space+ f.getName());
}else if(f.isDirectory()){//文件名
System.out.println(space+ f.getName());
listFile2(f, space+" ");
}
}
}
//案例3:列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构,效果如上所示。
public static void listFile3(File file, String space){
File[] listFiles = file.listFiles();
for(File f : listFiles){
if(f.isFile()){
System.out.println(space + f.getName());
}else if(f.isDirectory()){//文件名
System.out.println(space+ f.getName());
listFile3(f, "| " + space);
}
}
}
//案例4:删除一个非空的文件夹。
public static void deleteFile(File dir){
File[] listFiles = dir.listFiles();
for(File f : listFiles){
if(f.isFile()){
f.delete();
}else if(f.isDirectory()){//文件名
deleteFile(f);
}
}
dir.delete();
}
}