1.递归的概述

  方法定义中调用方法本身出现的现象。


2.递归的注意事项

  要有出口,否则就是死递归。

  次数不能太多,否则就栈内存溢出。

  构造方法不能递归使用。


3.递归的求阶乘

package cn;
/**
 * 递归 
 * 
 * 求5的阶乘
 * 
 */
public class DiGuiDemo {
	public static void main(String[] args) {
		int jc = 1;
		for (int i = 1; i <= 5; i++) {
			jc *= i;
		}
		System.out.println("5的阶乘是:"+jc);
		
		
	}
}

递归_第1张图片

package cn;
/**
 * 递归 
 * 
 * 求5的阶乘
 * 
 */
public class DiGuiDemo {
	public static void main(String[] args) {
		int jc = 1;
		for (int i = 1; i <= 5; i++) {
			jc *= i;
		}
		System.out.println("5的阶乘是:"+jc);
		
		System.out.println("5的阶乘:"+jiecheng(5));
		
	}
	/**
	 * 递归调用
	 * @param n
	 * @return
	 */
	public static int jiecheng(int n){
		if(n == 1){
			return 1;
		}
		return n*jiecheng(n-1);
	}
	
}

递归_第2张图片

4.不死神兔问题

数组实现

package cn;
/**
 * 有一对兔子,从出生后第3个月开始每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子 ,假如兔子不死,那么第二十个月有多少只兔子
 *   		兔子对数
 * 第一个月		1
 * 第二个月		1
 * 第三个月		2
 * 第四个月		3
 * 第五个月		5
 * ...
 * 
 * 由此可见兔子的数量是
 * 	1 1 2 3 5 8 ...
 */
public class DiGuiDemo2 {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = new int[20];
		arr[0] = 1;
		arr[1] = 1;
		for(int x = 2;x 
  

第二十个月的兔子总数是:6765


变量的变化实现

假如相邻的两个月的兔子对数是a,b

第一个相邻的数据:a=1,b=1

第一个相邻的数据:a=1,b=2

第一个相邻的数据:a=2,b=3

第一个相邻的数据:a=3,b=5

下一次的a是以前的b,下一次的b是以前的a+b

int a = 1;
		int b = 1;
		for(int x = 0;x<18;x++){
			//临时遍历存储上一次的a
			int temp = a;
			a = b;
			b = temp + b;
		}
		System.out.println("第二十个月的兔子总数是:"+b);

第二十个月的兔子总数是:6765


递归实现

package cn;
/**
 * 有一对兔子,从出生后第3个月开始每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子 ,假如兔子不死,那么第二十个月有多少只兔子
 *   		兔子对数
 * 第一个月		1
 * 第二个月		1
 * 第三个月		2
 * 第四个月		3
 * 第五个月		5
 * ...
 * 
 * 由此可见兔子的数量是
 * 	1 1 2 3 5 8 ...
 */
public class DiGuiDemo2 {
	public static void main(String[] args) {		
		System.out.println("第二十个月的弟子总数是:"+fib(20));
		
	}
	//递归实现
	public static int fib(int n){
		if(n ==1 || n==2){
			return 1;
		}
		return fib(n-1) + fib(n-2);
	}
	

}

第二十个月的兔子总数是:6765


5.获取指定目录下的.java文件的绝对路径

package cn;

import java.io.File;

/**
 * 需求:输出D:\MyEclipse2016\workspace\JavaSE下的所有以java结尾的文件的绝对路径
 * 分析
 * 		1.封装目录
 * 		2.获取该目录下所有的文件或者文件夹的File数组
 * 		3.遍历该File数组,得到每一个File对象
 * 		4.判断该File对象是否是文件夹
 * 			是:回到2
 * 			否:继续判断是否以.java结尾
 * 				是:就输出该文件的绝对路径
 * 				否:就随他去
 */
public class DiGuiDemo3 {
	public static void main(String[] args) {
		//封装目录
		File srcFolder = new File("D:\\MyEclipse2016\\workspace\\JavaSE");
		
		//递归功能实现
		getAllJavaFilePaths(srcFolder);
	}

	private static void getAllJavaFilePaths(File srcFolder) {
		//获取该目录下所有的文件或者文件夹的File数组
		File[] fileArray = srcFolder.listFiles();
		
		//遍历该File数组,得到每一个File对象
		for(File file :fileArray){
			//判断该File对象是否是文件夹
			if(file.isDirectory()){
				getAllJavaFilePaths(file);
			}else{
				if(file.getName().endsWith(".java")){
					System.out.println(file.getAbsolutePath());
				}
			}
		}
	}
}


6.递归删除带内容的目录

package cn;

import java.io.File;

/**
 * 递归删除带内容的目录
 * 分析:
 * 		1.封装目录
 * 		2.获取该目录下的所有文件或者文件夹的File数组
 * 		3.遍历该File数组,得到每一个File对象
 * 		4.判断该File对象是否是文件夹
 * 			是:回到2
 * 			否:就删除 
 *
 */
public class FileDeleteDemo {
	public static void main(String[] args) {
		//封装目录
		File srcFolder = new File("demo");
		
		//递归实现
		deleteFolder(srcFolder);
	}

	private static void deleteFolder(File srcFolder) {
		//获取该目录下的所有文件或者文件夹的File数组
		File[] fileArray = srcFolder.listFiles();
		//遍历该File数组,得到每一个File对象
		for(File file :fileArray){
			//.判断该File对象是否是文件夹
			if(file.isDirectory()){
				deleteFolder(file);
			}else{
				System.out.println(file.getName()+"--"+file.delete());
			}
		}
		
		//删除完所有文件之后,可以将文件夹删除
		System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
	}
}

谨慎使用