递归
1,方法定义中自身调用自身的现象。
2,注意事项:
1,递归方法没有出口,会成为无限循环,直到溢出。//StackOverflowError
2,递归次数过多,会导致栈内存溢出。
3,构造方法不能定义递归。
3,案例:
1,求20的阶乘
/** * 求阶乘 :20! * 出口:当阶乘成为1的时候结束 * 规律:n(n-1)! * */ public class Recursion{ public static void main(String[] args){ System.out.println(rec(20)); } public static int rec(int n ){ if(n==1){ return 1; }else{ return n*rec(n-1); } } }
2,古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问20个月的兔子对数为多少?
/** * 分析: * 1,1,2,3,5,8,13..... * 出口:第1,2,3月已知 * 规律:从第三项开始,第一项是前两项之和 */ public class Rabbit{ public static void main(String[] args){ System.out.println(getRabbit(20)); } public static int getRabbit(int n){ if(n==1||n==2){ return 1; }else{ return getRabbit(n-1)+getRabbit(n-2); } } }
3,输出d:\盘以.java结尾文件路径
/** * 分析: * 1 创建目录,获取该目录的File数组 * 2 遍历File数组,获取每一个File对象 * 3 判断该File是否是文件夹 * 是 回到第2步 * 否 是否以.java结尾 * 是 输出该文件的绝对路径 * 否 */ public SearchDemo{ public static void main(String[] args){ File srcFile=new File("d:\");//d盘下目录过多,会报NullPointerExcetpion getPath(srcFile); } public static void getPath(File srcFile){ File[] fileArray=srcFile.listFiles(); for(File file: fileArray){ if(file.isDirectory()){ getPath(file); }else{ if(file.getName().endsWith(".java")){ System.out.println(file.getAbsolutePath()); } } } } }
4,删除d:\盘以.java结尾的文件
/** * 分析: * 1 封装目录,获取该目录的file数组 * 2 获取每一个file数组 * 3 判断是否为目录 * 是 返回第2步 * 否 是否以.java结尾 * 是 删除 * 否 */ public class DeleteDemo{ public static void main(String[] args){ File srcFile=new File("d:\"); //d盘下目录过多,会报NullPointerExcetpion deleteFile(srcFile); } public static void deleteFile(File srcFile){ File[] fileArray=srcFile.listFiles(); if(fileArray!=null){ for(File file: fileArray){ if(file.isDirectory()){ deleteFile(file); }else{ if(file.getName().endsWith(".java")){ System.out.println(file.getName()+"-"file.delete()); } } System.out.println(srcFile.getName()+""+srcFile.delete()); //删除已经清空的文件夹 } } } }