黑马程序员————java中的递归原理




------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一.递归: 


 1.递归的概述:


  递归是基于:方法可以自己调用自己;并且是在方法内部调用自己


 2.注意:

        一定要有结束条件,否则持续运行,形成了死递归
       递归的次数不能太多,都则就会造成堆栈溢出
       构造方法不能递归调用,但是可以循环调用(就是调用另一个构造方法,哪一个构造方法再调用此构造方)


 3.递归的使用思想:


  递归就是循环调用,每次调用,都把初始条件封装处理好向下传递。


 4.重点练习:


  1).斐波那契数列(不死神兔)


   解决思想就是:本月的兔子对数等于上个月的兔子对数和上上个月的兔子对数之和。
   
   
   方法一:使用数组:数组的长度代表要计算的最终的"月数",每个元素,就是当月的兔子的对数


int intArray=new int[20];
intArray[0]=1;
intArray[1]=1;
for(int i=2;i<intArray.length;i++){
 intArray[i]=intArray[i-1]+intArray[i-2];
}



   
   
  ★★★方法二:使用两个变量


月份:1   2   3   4   5   6
对数;1   1   2   3   5   8
变量 a=0 a=1 a=1 a=2 a=3 a=5
     b=1 b=1 b=2 b=3 b=5 b=8
其中b作为每月兔子数,a作为一个临时变量


int a=0;
int b=1;
for(int i=1;i<=20;i++){
 //那么i作为月份
 b=b+a;//这一个月的b等于上个月b+a
 a=b-a;//然后将上个月的b赋值给这个月的a
}//此方法不好,思想不好理解。但是还是可以很好的计算




   方法三:使用递归方法


public int fib(int month){
 while(month==1||month==2){
  return 1;
 }
 return fib(month-1)+fib(month-2);//调用方法计算上一个月的和上上月的
}



  2).递归输出指定目录下所有的java文件的绝对路径案例

public class Demo {
    public static void main(String[] args) {
  	//首先使用file封装一个目录
 	 File file=new File("D:\\WotDownload");
  	System.out.println(file.getName());
  	//创建一个方法
  	find(file);    
    }
   private static void find(File file) {
  	//获取目录下的所有文件和目录的引用
 	File[] listfile=file.listFiles();
  	System.out.println("|--"+file.getName()+"文件夹");
 	//遍历当前目录下的文件和目录
  	for(File f:listfile ){
   		//判断当前的文件是否是文件
  		 if(f.isFile()&&f.getName().endwith(".java")){
   			 System.out.println("\t|---"+f.getName());;
   	}else if(f.isDirectory()){
   	 find(f);
   	}
   
    }
  }
}


  3).递归删除带内容的目录案例



public class Demo {
   public static void main(String[] args) {
 	 // 首先使用file封装一个目录
 	 File file = new File("D:\\WotDownload1");
 	 System.out.println(file.getName());
 	 // 创建一个方法
 	 find(file);

    }

   private static void find(File file) {
  	// 获取目录下的所有文件和目录的引用
  	File[] listfile = file.listFiles();
  	System.out.println("|--" + file.getName() + "文件夹");
  	// 遍历当前目录下的文件和目录
 	for (File f : listfile) {
   	// 判断当前的文件是否是文件
   		if (f.isFile()) {
   			 System.out.println("\t|---" + f.getName());
   			 f.delete();
  		 } else if (f.isDirectory()) {
    		find(f);
   		}
 	 }
  	file.delete();//经过前面的过程,文件目录里的文件都被删除了,可以删除此目了
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值