hello,我是橘子,今天才详细理解什么是递归
递归
一、概述:
方法定义中调用方法本身的现象,换而言之就是写函数的时候自己调用自己,区分什么是递归,什么是嵌套调用
嵌套调用例子:
//比如这种求三个数的最大值,就是嵌套调用
Math.max(c,Max.max(a,b))
递归调用例子:
public void show(int n){
if(n==0){
System.exit(0);
}
System.out.println(n);
//自己调用自己函数:
show(--n);
}
二、注意事项:
A:递归一定有出口,否则死递归
B:递归次数不能太多,否则就内存溢出
C:递归方法不能递归使用,比如构造方法不能调用构造方法
//这种构造函数,不能自己调用自己
class Demo(){
public Demo(){
Demo();
}
}
三、阶乘例子讲解
/*
* 需求:请用代码实现求5的阶乘
*
* 5! = 1*2*3*4*5
* 5! = 5*4!
*
* 有几种方案要实现呢?
* A:循环实现
* B:递归实现
*/
public class DiGuiDemo {
public static void main(String[] args) {
System.out.println("5的阶乘是:"+jiCheng(5);
}
public static int jiCheng(int n){
if(n==1){
return 1;
}else{
return n*jiCheng(n-1);
}
}
}
关于此代码的理解:图片可能看不清,说明就是出口是已知的,即阶乘1=1
这个是关于代码的解释,具体内存是怎么样存储的:
四、递归的举例:
1、斐波那契数列
/*
* 1,1,2,3,5,8
规则:
* A:从第三项开始,每一项是前两项之和
* B:而且说明前两项是已知的
*
* 如何实现这个程序呢?
* 递归实现
*/
public class DiGuiDemo2 {
public static void main(String[] args) {
//6765
int fi = fib(20);
System.err.println(fi);
}
/*
* 方法:
* 返回类型int
* 参数列表int n
* 出口条件:
* 第一个月是1,第二个月是1
* 规律:
* 从第三个月开始,每一个月是前两个月的和
*/
public static int fib(int n){
if(n==1 || n==2){
return 1;
}else{
return fib(n-1)+fib(n-2);
}
}
}
2、把E:\JavaSE_WorkSpace目录下所有java结尾的文件的绝对路径给输出在控制台
import java.io.File;
/*
* 需求:请大家把E:\JavaSE_WorkSpace目录下所有java结尾的文件的绝对路径给输出在控制台。
*
* 分析:
* A:封装目录
* B:获取该目录下所有的文件或者文件夹的File数组
* C:遍历该File对象是否是文件夹
* 是:回归B
* 否:继续判断是否以.java结尾
* 是:就输出该文件的绝对路径
* 否:不搭理它
*/
public class FilePathDemo {
public static void main(String[] args) {
//封装目录
File srcFolder = new File("E:\\JavaSE_WorkSpace");
//递归功能实现
getAllJavaFilePaths(srcFolder);
}
private static void getAllJavaFilePaths(File srcFolder) {
File[] fileArray = srcFolder.listFiles();
for(File file : fileArray){
if(file.isDirectory()){
getAllJavaFilePaths(file);
}else{
if(file.getName().endsWith(".java")){
System.out.println(file.getAbsolutePath());
}
}
}
}
}
3、递归删除带内容的目录
import java.io.File;
/*
* 需求:递归删除带内容的目录
*
*目标我已经给定:demo
*
*分析:
* A:封装目录
* B:获取目录下的所有文件或者文件夹的File数组
* C:遍历File数组,得到每一个File对象
* D:判断该File对象是否是文件夹
* 是:回归B
* 否:就删除
*/
public class FileDeleteDemo {
public static void main(String[] args) {
//封装目录
File srcFolder = new File("demo");
//递归实现
deleteFolder(srcFolder);
}
private static void deleteFolder(File srcFolder) {
File[] fileArray = srcFolder.listFiles();
//先删除文件夹里面的文件,后删除文件夹
for(File file : fileArray){
if(file.isDirectory()){
deleteFolder(file);
}else{
System.out.println(file.getName()+"----"+file.delete());
}
}
//由于递归删除文件夹
System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
}
}
原来demo中的文件如下
运行结果后,删除过程如下:
1.txt----true
2.txt----true
aaa—true
demo—true