java递归api_javaAPI_IO流基础_递归使用

IO流_递归

1.递归概述

递归指的是方法定义中调用自身方法的情况。

2.递归的注意事项

(1).要有出口,否则就是死递归

(2).次数不能太多,否则就内存溢出

(3).构造方法不能递归使用[不然在创建对象的时候就会内存溢出]

3.递归解决问题的思想

(1).分解法:

把问题细分为一个基本皆可以解决的单元,如:7+8 = ? --> 3+4 =? 4+4 =? --->1+2 =?----> 1+1 =2;

(2).合并发:

合并发就是把细分好的每一个基本单元合并成为我们要解决的问题,如上所述

4.递归实现的步骤以及注意事项

(1).写一个方法

(2).出口条件(这是一个已知条件*****)

(3).规律

5.递归的基本代码实现[求:5的阶乘]

public static void main(String[] args) {

System.out.println("5的阶乘是:"+jieCheng(5));

}

/*

* 做递归要写一个方法:

* 返回值类型:int

* 参数列表:int n

* 出口条件:

* if(n == 1) {return 1;}

* 规律:

* if(n != 1) {return n*方法名(n-1);}

*/

public static int jieCheng(int n){

if(n==1){

return 1;

}else {

return n*jieCheng(n-1);

}

}

6.递归相关练习

(1).递归输出斐波那契数列:

/*

* 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

* 分析:我们要想办法找规律

* 兔子对数

* 第一个月: 1

* 第二个月: 1

* 第三个月: 2

* 第四个月: 3

* 第五个月: 5

* 第六个月: 8

* ...

*

* 由此可见兔子对象的数据是:

* 1,1,2,3,5,8...

* 规则:

* A:从第三项开始,每一项是前两项之和

* B:而且说明前两项是已知的

*/

/*

* 方法: 返回值类型: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目录下所有的java结尾的文件的绝对路径给输出在控制台。

*

* 分析:

* A:封装目录

* B:获取该目录下所有的文件或者文件夹的File数组

* C:遍历该File数组,得到每一个File对象

* D:判断该File对象是否是文件夹

* 是:回到B

* 否:继续判断是否以.java结尾

* 是:就输出该文件的绝对路径

* 否:不搭理它

*/

public class FilePathDemo {

public static void main(String[] args) {

// 封装目录

File srcFolder = new File("E:\\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 {

// 继续判断是否以.java结尾

if (file.getName().endsWith(".java")) {

// 就输出该文件的绝对路径

System.out.println(file.getAbsolutePath());

}

}

}

}

}

(3)递归删除带内容的目录[就是删除多级目录,从文件开始一级一级的往上面删除]

/*

* 需求:递归删除带内容的目录

*

* 目录我已经给定: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数组

File[] fileArray = srcFolder.listFiles();

if (fileArray != null) {

// 遍历该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());

}

}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值