递归问题,阶乘,斐波那契数列

这篇博客由橘子撰写,深入解析了递归的概念,包括递归的概述、注意事项,并通过阶乘计算及斐波那契数列等实例进行详细讲解,还涉及到在实际操作中如何使用递归处理文件路径和删除目录的问题。
摘要由CSDN通过智能技术生成

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值