递归概述和注意事项
package fun_01;
/*
* 递归概述和注意事项
*
* 递归:方法定义中调用方法本身的现象
* public void show(int n){
* if(n<=0){
* System.exit(0);
* }
* System.out.println(n);
* show(n--);
* }
*
* 注意事项:
* A:递归一定要有出口,否则就是死递归
* B:递归的次数不能太多,否则就内存溢出
* C:构造方法不能递归使用
* 举例:
* A:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
* 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
* 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
* 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
* ...
* 庙挂了,或者山崩了。
*
* B:学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
* 学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
* 学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
* 学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费
* ...
* 娶不到媳妇,或者生不了娃娃
*/
public class DiguiDemo {
}
递归求5的阶乘案例
package fun_01;
/*
* 递归求5的阶乘案例
*
* 需求:请用代码实现求5的阶乘
*
* 下面的知识要知道:
* 5! = 1*2*3*4*5
* 5! = 5*4!
*
* 有几种方案实现呢?
* A:循环实现
* B:递归实现
* a:做递归要写一个方法
* b:出口条件
* c:规律
*/
public class DiguiDemo2 {
public static void main(String[] args) {
int jc = 1;
for (int x = 2; x <= 5; x++) {
jc *= x;
}
System.out.println("5的阶乘是:" + jc);
System.out.println("5的阶乘是:" + jieCheng(5));
}
/*
* 做递归要写一个方法:
* 返回值类型:int
* 参数列表:int n
* 出口条件:
* if(n == 1){return 1;}
* 规律:
* if(n != 1){return n*方法名(n-1);}
*
*/
public static long jieCheng(long n) {
if (n == 1) {
return 1;
} else {
return n * jieCheng(n - 1);
}
}
}
递归输出指定目录下所有的java文件的绝对路径案例
package fun_02;
import java.io.File;
/*
* 递归输出指定目录下所有的java文件的绝对路径案例
*
* 需求:把f:\java myeclipse目录下所有的java结尾的文件的绝对路径给输出在控制台。
*
* 分析:
* A:封装目录
* B:获取该目录下的文件或者文件夹的File数组
* C:遍历该File数组,得到每一个File对象
* D:判断该File对象是否是文件夹
* 是:回到B
* 否:继续判断是否以.java结尾
* 是:就输出该文件的绝对路径
* 否:不搭理它
*/
public class FilePathDemo {
public static void main(String[] args) {
// 封装目录
File srcFolder = new File("f:\\java myeclipse");
// 递归功能实现
getAllJavaFilePaths(srcFolder);
}
private static void getAllJavaFilePaths(File srcFolder) {
// 获取该目录下的文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles();
// 遍历该File数组,得到每一个File对象
for (File file : fileArray) {
if (file.isDirectory()) {
getAllJavaFilePaths(file);
} else {
if (file.getName().endsWith(".java")) {
System.out.println(file.getAbsolutePath());
}
}
}
}
}
递归删除带内容的目录案例
package fun_02;
import java.io.File;
/*
* 递归删除带内容的目录案例
*
* 需求:递归删除带内容的目录
*
* 给定目录:demo
*
* 分析:
* A:封装目录
* B:获取该目录下的文件或者文件夹的File数组
* C:遍历该File数组,得到每个File对象
* D:判断该File对象是否是文件夹
* 是:回到B
* 否:就删除
*/
public class FileDeleteDemo {
public static void main(String[] args) {
// 封装目录
File srcFolder = new File("demo");
// 递归实现
DeleteFolder(srcFolder);
}
/*
* 方法: 返回值类型:void 参数列表:File srcFolder 出口条件: 如果是文件夹就删除 规律: 从文件开始删除,一直到文件夹
*/
private static void DeleteFolder(File srcFolder) {
// 获取该目录下的文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles();
if (fileArray != null) {// 避开系统保护文件或者文件夹,其它都删除
// 遍历该File数组,得到每个File对象
for (File file : fileArray) {
// 判断该File对象是否是文件夹
if (file.isDirectory()) {
DeleteFolder(file);
} else {
System.out.println(file.getName() + "---" + file.delete());
}
}
System.out
.println(srcFolder.getName() + "---" + srcFolder.delete());
}
}
}