zoukankan      html  css  js  c++  java
  • 递归概要及经典案例

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

    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 }
  • 相关阅读:
    MacOS Sierra允许运行任何来源的程序
    Windows Server2008 R2中的角色
    Linux根目录解析
    Linux安装配置SVN服务器
    Linux6.x修改出eth0网卡的解决方法
    如何利用mount命令挂载另一台服务器上的目录
    Arcgis水文分析-Dem提取集水区
    前端布局之Flex布局
    其实我就是想好好的写写代码(一个伪程序猿的独白)
    WebApi关于配置全局返回Json数据格式时间以及命名小写
  • 原文地址:https://www.cnblogs.com/lyywj170403/p/9270060.html
Copyright © 2011-2022 走看看