递归概要及经典案例

递归
定义:方法定义中调用方法本身的现象

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 }

猜你喜欢

转载自www.cnblogs.com/lyywj170403/p/9270060.html