递归是方法体内部调用方法自身的一种现象
1, 递归的次数不能太多,否则就会内存溢出
2, 构造方法不能递归
3, 递归需要在合适的时候结束,否则就是一个死递归
如何定义一个递归?
找到出口
找到规律
两个经典算法:
1,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十个月的兔子对数为多少?
2,小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个。
1:规律:从第三个月开始的兔子对数=前两个月兔子对数之和
出口:当是第一个月或者第二个月的时候返回1对兔子
public static int test1(int month){
if(month<=2)
return 1;
else
return 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天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?