递归
来源:互联网 发布:linux 删除路由表 编辑:程序博客网 时间:2024/06/13 02:27
递归,是指程序调用自身,当然,递归不会无休止地调用下去,它必然有一个出口,满足出口的条件程序会结束
练习一: 计算文件夹的大小
/* * ###23.01_File类递归练习(统计该文件夹大小)* 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 * 1 从键盘接受一个文件路径 * 2 将该路径封装成 File结果 * 3 对file 对象判断 * 4 将不是文件夹的文件路径返回 * * 统计文件夹的大小 * 1 定义一个求和变量 * 2 获取该文件夹下所有的文件和文件夹 * 3 遍历数组数组 * 4 判断是文件就计算大小 * 5 是文件夹就递归调用 * * * */public class text22 { public static void main(String[]args){ File dir=getDir(); System.out.print("文件输入成功"); System.out.print("文件夹的大小"+getFileLength(dir)); } private static long getFileLength(File dir) { long sum = 0; File[] files=dir.listFiles(); for (File file : files) { if (file.isDirectory()) { sum+=getFileLength(file); }else if (file.isFile()) { sum+=file.length(); } } return sum; } private static File getDir() { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); String filepath=scanner.nextLine(); File dir=new File(filepath); while (true) { if(!dir.exists()) { System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:"); }else if(dir.isFile()) { System.out.println("您录入的是文件路径,请输入一个文件夹路径:"); }else { return dir; } } } }
练习二 :
从键盘接收一个文件夹路径,删除该文件夹
package com.itheima;import java.io.File;import java.util.Scanner;public class text22 { /** * 需求:2,从键盘接收一个文件夹路径,删除该文件夹 * * 删除该文件夹 * 分析: * 1,获取该文件夹下的所有的文件和文件夹 * 2,遍历数组 * 3,判断是文件直接删除 * 4,如果是文件夹,递归调用 * 5,循环结束后,把空文件夹删掉 */ public static void main(String[] args) { //1,创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径:"); String line = sc.nextLine(); File dir = new File(line); //获取文件夹路径 deleteFile(dir); } /* * 删除该文件夹 * 1,返回值类型 void * 2,参数列表File dir */ public static void deleteFile(File dir) { File[] subFiles = dir.listFiles(); for (File subFile : subFiles) { if(subFile.isFile()) { subFile.delete(); }else { deleteFile(subFile); } } dir.delete(); }}
练习三
从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
package com.itheima;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Scanner;public class Test3 { /** * 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 * * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 * 分析: * 1,在目标文件夹中创建原文件夹 * 2,获取原文件夹中所有的文件和文件夹,存储在File数组中 * 3,遍历数组 * 4,如果是文件就用io流读写 * 5,如果是文件夹就递归调用 * @throws IOException */ public static void main(String[] args) throws IOException { File src =getDir(); File dest =getDir(); if(src.equals(dest)) { System.out.println("目标文件夹是源文件夹的子文件夹"); }else { copy(src,dest); } } private static void copy(File src, File dest) throws IOException { // TODO Auto-generated method stub //1 创建文件目录 File newdir=new File(dest,src.getName()); newdir.mkdir(); //2 获取子文件夹目录列表 File[] subfiles=src.listFiles(); for (File file : subfiles) { if (file.isFile()) { BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File(newdir, file.getName()))); int ch=0; while ((ch=bis.read())!=-1) { bos.write(ch); } bos.flush(); bos.close(); bis.close(); }else { copy(file, newdir); } } } 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,返回值类型void * 2,参数列表File src,File dest */
练习四 :
用面向对象的思想 解决 递归问题
不死神兔* 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。* 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,* 问:一对刚出生的兔子,一年内繁殖成多少对兔子?
class Robit{
int idkey;
int age;
public Robit(int idkey,int age ) {
this.idkey=idkey;
this.age=age;
}
public void grow() {//兔子成长成大兔子
idkey=2;
}
}
public class text12Robiit {
static ArrayList arryArrayList =new ArrayList<>();
public static void main(String arg[]){
Robit robitant=new Robit(1,0);
arryArrayList.add(robitant);
for (int i = 0; i < 12; i++) {
for (int j=0;j
0 0