JavaSE-17.2【递归、案例-递归求阶乘、案例-递归遍历目录】
1 package day8.lesson2; 2 3 /* 4 2 递归 5 6 2.1 递归 7 8 递归概述 9 以编程的角度来看,递归指的是方法定义中调用方法本身的现象 10 11 递归解决问题的思路 12 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 13 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 14 15 递归的注意事项 16 递归出口:否则内存溢出 17 递归规则:与原问题相似的规模较小的问题 18 注意:递归虽然有出口,但是递归的次数也不宜过多,否则内存溢出 19 */ 20 public class DiguiDemo { 21 public static void main(String[] args) { 22 /*stage1/day6/demo2.java 23 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 24 假如兔子都不死,问第二十个月的兔子对数为多少?*/ 25 int[] arr = new int[20]; 26 arr[0] = 1; 27 arr[1] = 1; 28 for(int i=2; i<arr.length; i++){ 29 arr[i] = arr[i-2] + arr[i-1]; //规律总结 30 } 31 System.out.println("第二十个月的兔子对数:" + arr[19]); //6765 32 33 /* 34 采用递归解决此问题 35 定义一个方法f(n):表示第n个月的兔子对数 36 那么,第n-1个月的兔子对数该如何表示呢?f(n-1) 37 同理,第n-2个月的兔子对数该如何表示呢?f(n-2) 38 */ 39 40 // System.out.println("第二十个月的兔子对数:" + f(20)); //StackOverflowError当堆栈溢出发生时抛出一个应用程序递归太深 41 42 System.out.println("第二十个月的兔子对数:" + f(20)); //6765 43 } 44 45 /*public static int f(int n){ 46 return f(n-1) + f(n-2); 47 }*/ 48 49 public static int f(int n){ 50 if(n==1 || n==2){ 51 return 1; 52 }else { 53 return f(n-1) + f(n-2); 54 } 55 } 56 57 }
1 package day8.lesson2; 2 3 /* 4 2.2 案例-递归求阶乘 5 阶乘:5!=5*4*3*2*1 6 递归出口:1!=1 7 递归规则:n!=n*(n-1)! 8 */ 9 public class DiguiDemo2 { 10 public static void main(String[] args) { 11 System.out.println(jc(5)); //120 12 } 13 14 public static int jc(int n){ 15 if(n == 1){ 16 return 1; //<--递归出口 17 }else{ 18 return n * jc(n-1); //<--递归规则 19 } 20 } 21 22 }
1 package day8.lesson2; 2 3 import java.io.File; 4 5 /* 6 2.3 案例-递归遍历目录 7 给定一个路径,通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台 8 9 */ 10 public class DiguiDemo3 { 11 public static void main(String[] args) { 12 File srcFile = new File("stage2\\src\\day8"); 13 getAllFilePath(srcFile); 14 } 15 16 //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象 17 public static void getAllFilePath(File srcFile){ 18 //获取给定的File目录下所有的文件或者目录的File数组 19 File[] fileArr = srcFile.listFiles(); 20 //遍历该File数组,得到每一个File对象 21 if(fileArr != null){ 22 for (File f: fileArr){ 23 if(f.isDirectory()){ //判断该File对象是否是目录 24 getAllFilePath(f); //是:递归调用 <-- 递归规则 25 }else { 26 System.out.println(f.getAbsoluteFile()); //不是:获取绝对路径输出在控制台 <-- 递归出口 27 } 28 } 29 } 30 } 31 32 }