递归算法及应用

来源:互联网 发布:数组怎么用 编辑:程序博客网 时间:2024/05/22 03:29

递归是方法体内部调用方法自身的一种现象

1,  递归的次数不能太多,否则就会内存溢出
2, 构造方法不能递归
3, 递归需要在合适的时候结束,否则就是一个死递归
 如何定义一个递归?
     找到出口
     找到规律

两个经典算法:

1,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十个月的兔子对数为多少?

2,小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个。


1:规律:从第三个月开始的兔子对数=前两个月兔子对数之和
      出口:当是第一个月或者第二个月的时候返回1对兔子

     

public static int test1(int month){if(month<=2)return 1;elsereturn test1(month-2)+test1(month-1);}
2: 规律:前一天的桃子数=(后一天的桃子数+1)*2

       出口:第10天时,还剩1个桃子

public static int test2(int day){if(day==10){return 1;}else{return (test2(day+1)+1)*2;}}
3:java中的应用

     a,递归查找一个目录下所有后缀是jpg的文件

     b,递归删除一个多层目录

     a

        1.将指定目录封装成一个File对象
        2.调用搜索指定后缀名文件的方法
        3.判断当前的文件是不是一个标准文件
            出口:如果是就直接判断后缀名是不是要求的后缀名,如果是要求的后缀名就直接输出
            如果不是一个标准的文件,直接开始第4步
        4.规律:获取文件夹底下所有子文件,然后再调用搜索指定后缀名文件的方法

private static void searchFileName(File file, String name) {//3.判断当前的文件是不是一个标准文件if(file.isFile()){//出口:如果是就直接判断后缀名是不是要求的后缀名,如果是要求的后缀名就直接输出if(file.getName().endsWith(name)){System.out.println(file.getAbsolutePath());}}else{//如果不是一个标准的文件,直接开始第4步//4.规律:获取文件夹底下所有子文件,然后再调用搜索指定后缀名文件的方法File[] files = file.listFiles();for(File f : files){searchFileName(f, name);}}}
       b

        1.将删除的文件夹封装成File对象
        2.直接调用删除文件夹的方法
        3.判断当前的文件是不是一个标准的文件
            如果是就直接删除
            如果不是,继续第4步
        4.获取文件夹底下所有的子文件,然后遍历删除所有的子文件之后再删除当前的文件

private static void deleteFolder(File file) {//3.判断当前的文件是不是一个标准的文件if(file.isFile()){//如果是就直接删除file.delete();}else{//如果不是,继续第4步//4.获取文件夹底下所有的子文件,然后遍历删除所有的子文件之后再删除当前的文件File[] files = file.listFiles();for(File childFile : files){//调用删除方法deleteFolder(childFile);}//删除自己,现在这个file就是一个空文件夹了file.delete();}}


 *以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?