Java递归练习题

1,从键盘接收一个文件夹路径,统计该文件夹大小

package demo;

import java.io.File;
import java.util.Scanner;

public class Test1 {

	public static void main(String[] args) {
		File file = getDirectory();
		System.out.println(fileSize(file));
	}

	// 判断是否是文件夹
	public static File getDirectory() {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入文件路径:");

		while (true) {
			String path = sc.next();
			File file = new File(path);
			if (!file.exists()) {
				System.out.print("文件不存在,请重新输入:");
			} else if (file.isFile()) {
				System.out.print("您输入的是文件路径,请重新输入:");
			} else {
				return file;
			}
		}

	}

	// 使用递归判断文件夹大小
	public static int fileSize(File file) {

		int size = 0;

		File[] files = file.listFiles();

		for (File file1 : files) {
			if (file1.isFile()) {
				size += file1.length();
			} else {
				size += fileSize(file1);
			}
		}

		return size;
	}

}

2,从键盘接收一个文件夹路径,删除该文件夹

package demo;

import java.io.File;
import java.util.Scanner;

public class Test2 {

	public static void main(String[] args) {
		File file = getDirectory();
		deleteDirectory(file);
		if (file.exists()) {
			System.out.println("删除失败");
		} else {
			System.out.println("删除成功");
		}
	}

	// 判断是否是文件夹
	public static File getDirectory() {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入文件路径:");

		while (true) {
			String path = sc.next();
			File file = new File(path);
			if (!file.exists()) {
				System.out.print("文件不存在,请重新输入:");
			} else if (file.isFile()) {
				System.out.print("您输入的是文件路径,请重新输入:");
			} else {
				return file;
			}
		}

	}

	// 使用递归删除文件夹
	public static void deleteDirectory(File file) {

		File[] files = file.listFiles();

		for (File file1 : files) {
			if (file1.isFile()) {
				file1.delete();
			} else {
				deleteDirectory(file1);
			}
		}

		// 当文件夹里没有文件时,删除文件
		file.delete();
	}

}

3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

package demo;

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 {

	public static void main(String[] args) throws IOException {
		File src = getDirectory();
		File dest = getDirectory();
		if (src.equals(dest)) {
			System.out.println("目标文件夹是原文件夹的子文件夹");
		} else {
			copyFile(src, dest);
		}

	}

	// 判断是否是文件夹
	public static File getDirectory() {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入文件路径:");

		while (true) {
			String path = sc.next();
			File file = new File(path);
			if (!file.exists()) {
				System.out.print("文件不存在,请重新输入:");
			} else if (file.isFile()) {
				System.out.print("您输入的是文件路径,请重新输入:");
			} else {
				return file;
			}
		}

	}

	// 使用递归拷贝文件夹
	public static void copyFile(File src, File dest) throws IOException {

		// 先要在目的文件夹里创建原文件夹
		File newFile = new File(dest, src.getName());
		newFile.mkdir();

		// 遍历原文件里的文件和文件夹
		File[] files = src.listFiles();

		for (File file1 : files) {
			if (file1.isFile()) {
				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file1));
				BufferedOutputStream bos = new BufferedOutputStream(
						new FileOutputStream(new File(newFile, file1.getName())));
				int b;
				while ((b = bis.read()) != -1) {
					bos.write(b);
				}
				bis.close();
				bos.close();
			} else {
				copyFile(file1, newFile);
			}
		}
	}

}

4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印

package demo;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Test4 {

	public static void main(String[] args) throws IOException {
		File file = getDirectory();
		tierPrint(file, 0);
	}

	// 判断是否是文件夹
	public static File getDirectory() {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入文件路径:");

		while (true) {
			String path = sc.next();
			File file = new File(path);
			if (!file.exists()) {
				System.out.print("文件不存在,请重新输入:");
			} else if (file.isFile()) {
				System.out.print("您输入的是文件路径,请重新输入:");
			} else {
				return file;
			}
		}

	}

	// 使用递归按层级打印
	public static void tierPrint(File file, int lev) throws IOException {

		File[] files = file.listFiles();

		for (File file1 : files) {
			for (int i = 0; i < lev; i++) {
				System.out.print("\t");
			}
			System.out.println(file1.getPath());
			if (file1.isDirectory()) {
				tierPrint(file1, lev + 1);
			}
		}
	}

}

5,假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,
问:一对刚出生的兔子,一年内繁殖成多少对兔子?
规律:1 1 2 3 5 8 13 21

package demo;

import java.util.Scanner;

public class Test5 {

	public static void main(String[] args) {

		// 规律: 1 1 2 3 5 8 13 21
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入天数:");
		int day = sc.nextInt();
		System.out.println(recursion(day));
		// System.out.println(array(day));
	}

	// 使用递归进行计算
	public static int recursion(int day) {

		if (day == 1 || day == 2) {
			return 1;
		} else {
			return recursion(day - 2) + recursion(day - 1);
		}

	}

	// 按数组方式计算
	public static int array(int day) {

		int[] is = new int[day];

		is[0] = 1;
		is[1] = 1;

		for (int i = 2; i < is.length; i++) {
			is[i] = is[i - 2] + is[i - 1];
		}
		return is[is.length - 1];
	}

}

6,约瑟夫环

N个人围成一圈,从第一个开始报数,每第三个人将被杀掉,最后剩下一个,其余人都将被杀掉。

package demo;

import java.util.ArrayList;

public class Test6 {

	public static void main(String[] args) {
		System.out.println(getLucklyNum(8));// 7
	}

	public static int getLucklyNum(int num) {

		ArrayList<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i <= num; i++) {
			list.add(i);
		}
		// 计数
		int count = 1;
		for (int i = 0; list.size() != 1; i++) {

			// 如果下标超过了最大下标,相当于又从一个人接着往下叫数
			if (i == list.size()) {
				i = 0;
			}

			// 每三个人就删除一个
			if (count % 3 == 0) {
				list.remove(i);
				i--;
			}

			count++;

		}

		// 最后剩下的一个人返回
		return list.get(0);
	}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值