A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小影姐姐 黑马粉丝团   /  2018-5-23 14:59  /  664 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


1、什么是递归调用

递归调用也可称为函数嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的就称为递归调用。
结论:简单来讲递归调用主要体现在函数的调用上,当前函数自己调用自己

2、递归调用的书写格式
递归调用可以分为两种:
1、  直接递归:函数自己调用自己
2、  间接递归:借助其实的函数来调用自己
例:函数A调用函数B,函数B调用函数C,函数C调用函数A

直接递归的书写格式:
    访问修饰符  返回值类型  函数名 (参数类型 参数名,...){
        //函数自己调用自己
        当前函数的名称(参数类型  参数名,...);
    }

间接递归的书写格式:

    访问修饰符 返回值类型 函数名1 (参数类型 参数名,...){
         //调用函数2
         函数名2(参数类型 参数名,...);
    }
   
    访问修饰符 返回值类型 函数名2 (参数类型 参数名,...){
        //调用函数1
        函数名1(参数类型 参数名,...);
    }


3、递归调用的简单应用
案例:计算5以内的累加值
传统实现方式:
    public int sum(int num){
              int count=0;//记录累加的值
              //循环  从1到5
              for(int i=1;i<=num;i++){
                 count = count + i;//累加值计算
              }
              return count;//返回累加的值
    }

递归实现方式:
    public int sum(int num){
              if(num==1){
                return 1;
              }
              //当前函数调用自己
              return num + sum(num-1);
    }

4、递归调用的原理
直接递归:函数自己调用自己
    public int sum(int num){
              if(num==1){
                return 1;
              }
              //当前函数调用自己
              return num + sum(num-1);
    }


5、递归调用的案例
案例:获取目录下所有的.jpg图片文件
    package com.itheima.recursion;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
   
    public class FileUtils {
            // 创建List集合对象,存储所有的.jpg文件对象
            private List<File> jpgList = new ArrayList<>();
           
        //返回存储.jps文件的集合对象
            public List<File> getJpgList() {
                    return jpgList;
            }
        //根据指定目录,获取该目录下所有的.jpg文件(含子目录)
            public void getJpgFiles(File dir){
                            if(!dir.exists()){
                              throw new RuntimeException("目录不存在!");
                            }
   
                    //获取指定目录下所有的文件对象
                            File[] files = dir.listFiles();
   
                            //遍历文件对象数组
                            for(File file : files){
                              //判断文件对象是文件还是文件夹
                              if(file.isFile()){//是文件
                                 //判断是否为.jpg文件
                         if(file.getName().toLowerCase().endsWith(".jpg")){
                                            //把.jpg文件对象存储到集合中
                                            jpgList.add(file);
                                     }
                              }else if(file.isDirectory()){//是文件夹
                                 //递归调用 getJpgFiles方法
                                     getJpgFiles(file);//把文件夹对象作为参数传递
                              }
                        }
                    }
    }

测试:
    package com.itheima.recursion;
   
    import java.io.File;
    import java.util.List;
    /**
     * 测试递归的调用
     *
     * @author 上海校区-唐文杰
     *
     */
    public class RecursionTest {
   
            public static void main(String[] args) {
                    //创建FileUtils对象
                    FileUtils  f = new FileUtils();
                    //调用方法,获取d:\io目录下所有的.jpg文件
                    f.getJpgFiles(new File("d:\\io"));
                    
                    List<File> jpgList=f.getJpgList();//获取到存储.jpg文件的集合
   
                    //遍历集合
                    for (File jpg : jpgList) {
                            System.out.println(jpg);
                    }
            }
    }

运行结果:
    d:\io\file1\美女1.jpg
    d:\io\file1\美女2.jpg
    d:\io\file2\img\程序猿.jpg
    d:\io\file2\img\黑马.jpg
    d:\io\file2\大海.jpg
    d:\io\file2\植物.jpg
    d:\io\file2\车.jpg
    d:\io\动物.jpg
    d:\io\妖.jpg


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马