IO流-递归

递归概述和注意事项

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());
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41690324/article/details/81516050