java学习日记_92:IO流之递归算法

来源:互联网 发布:阿尔法收益 知乎 编辑:程序博客网 时间:2024/06/08 15:27
递归:方法定义中调用方法本身的现象
  
  方法的嵌套调用,这不是递归。
  Math.max(Math.max(a,b),c);
  
  public void show(int n) {
  if(n <= 0) {
System.exit(0);
  }
  System.out.println(n);
  show(--n);
  }
  
  注意事项:
  •    A:递归一定要有出口,否则就是死递归
  •   B:递归的次数不能太多,否则就内存溢出
  •    C:构造方法不能递归使用
  
  举例:
  A:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
  从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
  从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
  从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
  ...

  庙挂了,或者山崩了



需求:请用代码实现求5的阶乘。
  下面的知识要知道:
  5! = 1*2*3*4*5
  5! = 5*4!
  
  有几种方案实现呢?

  •    A:循环实现
  •    B:递归实现
  •    a:做递归要写一个方法
  •    b:出口条件
  • c:规律

 public class DiGuiDemo {public static void main(String[] args) {int jc = 1;for (int x = 2; x <= 5; x++) {jc *= x;}System.out.println("5的阶乘是:" + jc);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);}}}

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
  分析:我们要想办法找规律

  •    兔子对数
  第一个月: 1
  第二个月: 1
  第三个月: 2
  第四个月: 3
  第五个月: 5
  第六个月: 8
  ...
  
  由此可见兔子对象的数据是:
  1,1,2,3,5,8...
  规则:
  •    A:从第三项开始,每一项是前两项之和
  •    B:而且说明前两项是已知的
  
  如何实现这个程序呢?
  A:数组实现
  B:变量的变化实现
  C:递归实现
  
 假如相邻的两个月的兔子对数是a,b
  第一个相邻的数据:a=1,b=1
  第二个相邻的数据:a=1,b=2
  第三个相邻的数据:a=2,b=3
  第四个相邻的数据:a=3,b=5
  看到了:下一次的a是以前的b,下一次是以前的a+b

public class DiGuiDemo2 {public static void main(String[] args) {// 定义一个数组int[] arr = new int[20];arr[0] = 1;arr[1] = 1;// arr[2] = arr[0] + arr[1];// arr[3] = arr[1] + arr[2];// ...for (int x = 2; x < arr.length; x++) {arr[x] = arr[x - 2] + arr[x - 1];}System.out.println(arr[19]);// 6765System.out.println("----------------");int a = 1;int b = 1;for (int x = 0; x < 18; x++) {// 临时变量存储上一次的aint temp = a;a = b;b = temp + b;}System.out.println(b);System.out.println("----------------");System.out.println(fib(20));}/* * 方法: 返回值类型: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);}}}

需求:递归删除带内容的目录
  
  目录我已经给定:demo
  
  分析:

  •    A:封装目录
  •    B:获取该目录下的所有文件或者文件夹的File数组
  •    C:遍历该File数组,得到每一个File对象
  •    D:判断该File对象是否是文件夹

是:回到B

   否:就删除


import java.io.File;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());}}}

需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。
  
  分析:
  •    A:封装目录
  •    B:获取该目录下所有的文件或者文件夹的File数组
  •    C:遍历该File数组,得到每一个File对象
  •    D:判断该File对象是否是文件夹

  是:回到B

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

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

否:不搭理它


import java.io.File;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());}}}}}

0 0
原创粉丝点击