递归
来源:互联网 发布:mac虚拟机win7镜像下载 编辑:程序博客网 时间:2024/06/08 01:09
递归
递归是方法本身调用方法的一种现象
Math类中有一个方法max()求最大值
1.方法嵌套不属于递归
Math.max(Math.max(10,20),30):方法嵌套
2.方法递归的条件:
1)必须定义方法
2)要有出口条件
3)寻找规律
3.递归可以用在构造方法上,但不能用在成员方法上
举例:
package digui;/* * 求5的阶乘 * 5!=5*4*3*2*1 * 5!=5*4! * 方式一:for循环 * 方式二:递归 */public class DiGuiDemo {public static void main(String[] args) {//for循环int jc=1;for(int x=5;x>0;x--){jc*=x;}System.out.println("5的阶乘是:"+jc);System.out.println("--------------");System.out.println(jieCheng(5)); }//递归//1)定义一个方法private static int jieCheng(int n) {//出口条件if(n==1){return 1;}else{return n*jieCheng(n-1);}}}
4.练习,子生孙孙生子
package digui;/* * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后 * 每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?(不死神兔) * 分析:找兔子对数的规律: * 兔子生长分三个周期, * 幼年,青年,老年 共计 * 第1月 1 0 0 1 * 第2月 0 1 0 1 * 第3月 1 0 1 2 * 第4月 1 1 1 3 * 第5月 2 1 2 5 * 第6月 3 2 3 8 * 第7月 5 3 5 13 * 第8月 8 5 8 21 * 兔子的总数分别为1,1,2,3,5,8,13,21....... * 即从第三个月起,后面的兔子总数都等于前面两个月的兔子总数之和 */public class DiGuiDemo2 {public static void main(String[] args) {//方法一:for循环//定义一个数组int[] arr=new int[20];arr[0]=1;arr[1]=1;for(int x=2;x<arr.length;x++){arr[x]=arr[x-1]+arr[x-2];System.out.println("第"+x+"个月的兔子对数是:"+arr[x]);}System.out.println("------"); System.out.println(fanZhi(20));}//方法二:递归private static int fanZhi(int n) {if(n==1||n==2){return 1;}else{return fanZhi(n-1)+fanZhi(n-2);}}}
5.递归删除带目录的内容
import java.io.FileWriter;import java.io.IOException;/* * 删除Demo文件夹下带内容的目录 * 1)将Demo文件封装成一个File对象 * 2)采用递归删除,定义一个方法 * 3)获取当前目录下所有的文件以及文件夹的File数组 * 4)给File数组做非空判断 * 遍历file数组,获取到每一个file对象 * 判断是否是文件夹,是,返回2)继续删除,不是,直接删除 * */public class DiGuiDemo3 {public static void main(String[] args) throws IOException {File file=new File("Demo\\aaa\\bbb");file.mkdirs();File file2=new File(file,"a.txt");file2.createNewFile();BufferedWriter bw=new BufferedWriter(new FileWriter(file2));bw.write("this is a txt");bw.flush();bw.close();File scrfile =new File("Demo");delete(scrfile);}private static void delete(File scrfile) {// TODO Auto-generated method stub//获取Demo文件夹下的所有文件以及文件夹的File数组File[]arrfile=scrfile.listFiles();for(File f:arrfile){//判断是否是文件夹if(f.isDirectory()){//是,继续返回去删除delete(f);}else{//否则直接删除文件System.out.println(f.getName()+","+f.delete());}}}}
6.递归输出绝对路径