1.递归
递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象。
package Study02;
/*递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象。*/
public class DIGUIdemo {
public static void main(String[] args) {
/*回顾不死神兔问题,求第20个月兔子的对数
每个月得兔子对数:1,1,2,3,5,8……*/
int []arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for (int i=2;i<arr.length;i++){
arr[i] = arr[i-1]+arr[i-2];
}
System.out.println(arr[19]);
//递归改进
System.out.println(f(20));
}
//递归方法
/* 递归解决问题,首先就是要定义一个方法:
定义一个方法f(n):表示第n个月的兔子对数
那么,第n-1个月的兔子对数:f(n-1)
同理,第n-2个月的兔子对数:f(n-2)*/
public static int f(int n){
if (n==1||n==2){
return 1;
}else {
return f(n-1)+f(n-2);
}
}
}
- 递归解决问题的思路:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算。
- 递归解决问题要找到两个内容:
- 递归出口:否则会出现内存溢出
- 递归规则:与原问题相似的规模较小的问题
2.案例:递归求阶乘
需求:用递归求5的阶乘,并把结果在控制台输出
package Study02;
public class DiGuiDemo01 {
public static void main(String[] args) {
int result = jieCheng(5);
System.out.println("5的阶乘是:"+result);
}
public static int jieCheng(int n){
if (n==1||n==0){
return 1;
}else {
return n*jieCheng(n-1);
}
}
}
3.案例:遍历目录
需求:给定一个路径D:\\java
,请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台。
- 思路:
- 根据给定的路径创建一个File对象
- 定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的File对象
- 获取给定的File目录下所有的文件或者目录的File数组
- 遍历该File数组,得到每一个File对象
- 判断该File对象是否是目录
- 是:递归调用
- 否:获取绝对路径输出在控制台
- 调用方法
package Study02;
import java.io.File;
/*需求:给定一个路径`D:\\java`,请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台。
- 思路:
- 根据给定的路径创建一个File对象
- 定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的File对象
- 获取给定的File目录下所有的文件或者目录的File数组
- 遍历该File数组,得到每一个File对象
- 判断该File对象是否是目录
- 是:递归调用
- 否:获取绝对路径输出在控制台
- 调用方法
*/
public class DiGuiDemo02 {
public static void main(String[] args) {
//- 根据给定的路径创建一个File对象
File srcFile = new File("D:\\Java");
//- 调用方法
getAllFilePath(srcFile);
}
//定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的File对象
public static void getAllFilePath(File srcFile){
//- 获取给定的File目录下所有的文件或者目录的File数组
File[] filesArray = srcFile.listFiles();
//- 遍历该File数组,得到每一个File对象
if (filesArray!=null){
for (File file:filesArray){
if (file.isDirectory()){
//- 是:递归调用
getAllFilePath(file);
}else {
//- 否:获取绝对路径输出在控制台
System.out.println(file.getAbsolutePath());
}
}
}
}
}