递归
定义:方法定义中调用方法本身的现象
public void show(){
show();
}
注意事项
A:要有出口,否则就是死递归
B:次数不能过多,否则内存溢出
C:构造方法不能递归使用
递归的案例:
A:递归求阶乘
1 public class DIGui { 2 3 /* 4 * 用递归求阶乘 5 * 6 * 实现方法:A 循环实现 7 * B 递归实现 8 * 写一个方法 9 * 出口条件 10 * 规律 11 */ 12 13 public static void main(String[] args) {
//循环实现 14 int jc = 1; 15 for(int x = 2; x <= 10; x++){ 16 jc *= x; 17 } 18 System.out.println("10的阶乘是:" + jc); 19 20 System.out.println("10的阶乘是:" + jiecheng(10)); 21 } 22 23 24 /* 25 * 写一个方法 26 * 返回值类型:int 27 * 参数列表:int n 28 * 出口条件:if(n == 1) {return 1;} 29 * 30 * 规律:if(n != 1) {return n*方法名(n-1);} 31 */ 32 33 public static int jiecheng(int n){ 34 if(n == 1){ 35 return 1; 36 }else { 37 return n*jiecheng(n - 1); 38 } 39 } 40 }
B:兔子问题
数据规则:1 1 2 3 5 8 ...... 斐波那契数列
1 public class DiGuiDemo { 2 public static void main(String[] args) { 3 //1.数组实现 定义一个数组 4 5 int[] arr = new int[20]; 6 arr[0] = 1; 7 arr[1] = 1; 8 9 for(int x = 2; x < arr.length; x++){ 10 arr[x] = arr[x - 2] + arr[x - 1]; 11 12 } 13 System.out.println(arr[19]); 14 15 16 //2.变量的变化实现 17 int a = 1; 18 int b = 1; 19 for(int x = 0; x < 18; x++){ 20 int temp = a; 21 a = b; 22 b = temp + b; 23 24 } 25 26 System.out.println(b); 27 28 29 System.out.println(fib(20)); 30 } 31 32 //3.递归实现 33 /* 34 * 方法:返回类型:int 35 * 参数列表:int n 36 * 37 * 出口条件:第一个月是1,第二月是1 38 * 规律:从第三个月开始 每个月是前两个月之和 39 */ 40 public static int fib(int n){ 41 if (n == 1 || n ==2){ 42 return 1; 43 }else { 44 return fib(n - 1) + fib(n - 2); 45 } 46 47 48 } 49 }
C:递归输出指定目录下所有指定后缀名的文件绝对路径
1 /* 2 * 需求:将F:JavaSE目录下所有的Java结尾的文件的绝对路径输出 3 * 4 * 步骤: 5 * A:封装目录 6 * B:获取该目录下所有的文件或者文件夹的File数组 7 * C:遍历该File数组,得到每个File对象 8 * D:判断该File对象是否是文件夹 9 * 是:返回到B 10 * 否:继续判断是否以.java结尾 11 * 是:输出该文件的绝对路径 12 * 否:不管 13 */ 14 public class FilePathDemo { 15 16 public static void main(String[] args) { 17 //封装目录 18 File srcFolder = new File("e:\JavaSE"); 19 20 //递归实现功能 21 getAllJFilePaths(srcFolder); 22 } 23 24 private static void getAllJFilePaths(File srcFolder) { 25 //获取该目录下所有的文件或者文件夹的File数组 26 File[] fileArray = srcFolder.listFiles(); 27 28 29 //遍历该File数组,得到每个File对象 30 for(File file : fileArray){ 31 //判断该File对象是否是文件夹 32 if(file.isDirectory()){ 33 getAllJFilePaths(file);//返回到B 34 }else{ 35 //继续判断是否以.java结尾 36 if(file.getName().endsWith(".java")){ 37 //输出该文件的绝对路径 38 System.out.println(file.getAbsolutePath()); 39 } 40 } 41 42 } 43 } 44 }
D:递归删除带内容的目录(小心使用)
1 /* 2 * 递归删除带内容的目录 3 * 4 * A:封装目录 5 * B:获取该目录下的所有文件或文件夹的File数组 6 * C:遍历该File数组得到每一个File对象 7 * D:判断该File对象是否是文件夹 8 * 是:返回到B 9 * 否:删除 10 */ 11 public class FileDelete { 12 public static void main(String[] args) { 13 //封装目录 14 File srcFolder = new File("demo"); 15 //递归实现 16 deleteFolder(srcFolder); 17 18 } 19 20 private static void deleteFolder(File srcFolder) { 21 //获取该目录下的所有文件或文件夹的File数组 22 File[] fileArray = srcFolder.listFiles(); 23 //遍历该File数组得到每一个File对象 24 for(File file : fileArray){ 25 //判断该File对象是否是文件夹 26 if(file.isDirectory()){ 27 //返回到B 28 deleteFolder(srcFolder); 29 }else{//否:删除 30 System.out.println(file.getName() + "——————————" + file.delete()); 31 } 32 } 33 //先删除这个目录里面的 最外面再删除指定的目录 34 System.out.println(srcFolder.getName() + "————————————————" + srcFolder.delete()); 35 } 36 37 }