您的位置:首页 > 职场人生

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

2015-06-13 21:33 260 查看


------<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();//经过前面的过程,文件目录里的文件都被删除了,可以删除此目了
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 递归 遍历