Java基础复习(四)-递归练习

    xiaoxiao2021-03-25  134

    该复习笔记是基于传智播客的Java基础视频-深入简出精华版,链接: https://pan.baidu.com/s/1bp7NuOJ,建议刚刚入门的小白不要看,因为涉及太多的细节了,看多了反而让你容易放弃Java之路,刚刚入门的小白推荐下面这一套视频-链接:https://pan.baidu.com/s/1pLuAj5x

    博主声明一下:我不是传智播客的什么托,只是一个菜鸟,现在在补着Java基础,搞了一套传智播客的Java视频以及Android视频,所以笔记可能会常出现这些字眼,请言语讽刺我是托的麻烦你闭嘴哈

    File类递归调用

    File类递归调用(统计特定文件夹的大小)

    需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 public class Test1 { /** * @param args * 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 * * 从键盘接收一个文件夹路径 * 1,创建键盘录入对象 * 2,定义一个无限循环 * 3,将键盘录入的结果存储并封装成File对象 * 4,对File对象判断 * 5,将文件夹路径对象返回 * * 统计该文件夹大小 * 1,定义一个求和变量 * 2,获取该文件夹下所有的文件和文件夹listFiles(); * 3,遍历数组 * 4,判断是文件就计算大小并累加 * 5,判断是文件夹,递归调用 */ public static void main(String[] args) { //File dir = new File("F:\\day06"); //System.out.println(dir.length()); //直接获取文件夹的结果是0 File dir = getDir(); System.out.println(getFileLength(dir)); } /* * 从键盘接收一个文件夹路径 * 1,返回值类型File * 2,参数列表无 */ public static File getDir() { //1,创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径:"); //2,定义一个无限循环 while(true) { //3,将键盘录入的结果存储并封装成File对象 String line = sc.nextLine(); File dir = new File(line); //4,对File对象判断 if(!dir.exists()) { System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:"); }else if(dir.isFile()) { System.out.println("您录入的是文件路径,请输入一个文件夹路径:"); }else { //5,将文件夹路径对象返回 return dir; } } } /* * 统计该文件夹大小 * 1,返回值类型long * 2,参数列表File dir */ public static long getFileLength(File dir) { //dir = F:\day06\day07 //1,定义一个求和变量 long len = 0; //2,获取该文件夹下所有的文件和文件夹listFiles(); File[] subFiles = dir.listFiles(); //day07 Demo1_Student.class Demo1_Student.java //3,遍历数组 for (File subFile : subFiles) { //4,判断是文件就计算大小并累加 if(subFile.isFile()) { len = len + subFile.length(); //5,判断是文件夹,递归调用 }else { len = len + getFileLength(subFile); } } return len; } }

    File类递归调用(删除该文件夹)

    需求:2,从键盘接收一个文件夹路径,删除该文件夹 public class Test2 { /** * 需求:2,从键盘接收一个文件夹路径,删除该文件夹 * * 删除该文件夹 * 分析: * 1,获取该文件夹下的所有的文件和文件夹 * 2,遍历数组 * 3,判断是文件直接删除 * 4,如果是文件夹,递归调用 * 5,循环结束后,把空文件夹删掉 */ public static void main(String[] args) { File dir = Test1.getDir(); //获取文件夹路径 deleteFile(dir); } /* * 删除该文件夹 * 1,返回值类型 void * 2,参数列表File dir */ public static void deleteFile(File dir) { //1,获取该文件夹下的所有的文件和文件夹 File[] subFiles = dir.listFiles(); //2,遍历数组 for (File subFile : subFiles) { //3,判断是文件直接删除 if(subFile.isFile()) { subFile.delete(); //4,如果是文件夹,递归调用 }else { deleteFile(subFile); } } //5,循环结束后,把空文件夹删掉 dir.delete(); } /* * 从键盘接收一个文件夹路径 * 1,返回值类型File * 2,参数列表无 */ public static File getDir() { //1,创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径:"); //2,定义一个无限循环 while(true) { //3,将键盘录入的结果存储并封装成File对象 String line = sc.nextLine(); File dir = new File(line); //4,对File对象判断 if(!dir.exists()) { System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:"); }else if(dir.isFile()) { System.out.println("您录入的是文件路径,请输入一个文件夹路径:"); }else { //5,将文件夹路径对象返回 return dir; } } } }

    File类递归调用(拷贝文件夹)

    需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 public class Test3 { /** * 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 * * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 * 分析: * 1,在目标文件夹中创建原文件夹 * 2,获取原文件夹中所有的文件和文件夹,存储在File数组中 * 3,遍历数组 * 4,如果是文件就用io流读写 * 5,如果是文件夹就递归调用 * @throws IOException */ public static void main(String[] args) throws IOException { File src = Test1.getDir(); File dest = Test1.getDir(); if(src.equals(dest)) { System.out.println("目标文件夹是源文件夹的子文件夹"); }else { copy(src,dest); } } /* * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 * 1,返回值类型void * 2,参数列表File src,File dest */ public static void copy(File src, File dest) throws IOException { //1,在目标文件夹中创建原文件夹 File newDir = new File(dest, src.getName()); newDir.mkdir(); //2,获取原文件夹中所有的文件和文件夹,存储在File数组中 File[] subFiles = src.listFiles(); //3,遍历数组 for (File subFile : subFiles) { //4,如果是文件就用io流读写 if(subFile.isFile()) { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName()))); int b; while((b = bis.read()) != -1) { bos.write(b); } bis.close(); bos.close(); //5,如果是文件夹就递归调用 }else { copy(subFile,newDir); } } } }

    File类递归调用(按层级打印)

    需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如: aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来 public class Test4 { /** * 需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如: * 把文件夹中的所有文件以及文件夹的名字按层级打印 * 分析: * 1,获取所有文件和文件夹,返回的File数组 * 2,遍历数组 * 3,无论是文件还是文件夹,都需要直接打印 * 4,如果是文件夹,递归调用 * day07 * day08 * xxx.jpg * yyy.txt * Demo1_Consturctor.class * Demo1_Consturctor.java * Demo1_Student.class * Demo1_Student.java */ public static void main(String[] args) { File dir = Test1.getDir(); //获取文件夹路径 printLev(dir,0); } public static void printLev(File dir,int lev) { //1,把文件夹中的所有文件以及文件夹的名字按层级打印 File[] subFiles = dir.listFiles(); //2,遍历数组 for (File subFile : subFiles) { for(int i = 0; i <= lev; i++) { System.out.print("\t"); } //3,无论是文件还是文件夹,都需要直接打印 System.out.println(subFile); //4,如果是文件夹,递归调用 if(subFile.isDirectory()) { //printLev(subFile,lev + 1); printLev(subFile,lev+1);//不可以lev++或者++lev,会破坏lev的值 } } } }

    斐波那契数列

    不死神兔故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?1 1 2 3 5 8 13第一个月一对小兔子 1第二个月一对大兔子 1第三个月一对大兔子生了一对小兔子 2第四个月一对大兔子生了一对小兔子一对小兔子长成大兔子 3第五个月两对大兔子生两对小兔子 一对小兔子长成大兔子 5 public static void main(String[] args) { // demo1(); System.out.println(fun(8)); } /* * 用递归求斐波那契数列 */ public static int fun(int num) { if (num == 1 || num == 2) { return 1; } else { return fun(num - 2) + fun(num - 1); } }

    1000的阶乘尾部零的个数(递归)

    需求:求出1000的阶乘尾部零的个数,用递归做 public int fun(int num) { if(num > 0 && num < 5) { return 0; }else { return num / 5 + fun(num / 5); } }

    递归的高级使用-汉诺塔问题

    前言:如果你跟我一样,看文章感觉很累的话,那么可以尝试一下看这个连小白都可以看得懂的那个参考视频

    参考文章: 1.Hanoi Tower 汉诺塔的简单分析/C - Geek_Ling - 博客园 2.Java经典编程300例之实例047 汉诺塔问题求解(递归) - - 博客频道 - .NET

    参考视频: 1.百度网盘链接: https://pan.baidu.com/s/1nuEP9CP 密码: 9ie9

    主要代码:

    public class HanoiTower { /** * 移动盘子 * topN:移动的盘子数 * from:起始塔座 * inter:中间塔座 * to:目标塔座 */ public static void doTower(int topN,char from,char inter,char to) { if(topN == 1) { System.out.println("盘子1,从"+ from + "塔座到" + to + "塔座"); } else { doTower(topN - 1, from, to, inter); System.out.println("盘子" + topN +",从" + from + "塔座到" + to + "塔座" ); doTower(topN - 1, inter, from, to); } } }

    测试代码:

    HanoiTower.doTower(3, 'A', 'B', 'C');

    运行结果:

    第三篇复习连接: Java基础复习(三) - it菜鸟的飞行梦 - 博客频道 - .NET

    第三篇复习连接: Java基础复习(五) - it菜鸟的飞行梦 - 博客频道 - .NET

    转载请注明原文地址: https://ju.6miu.com/read-4554.html

    最新回复(0)