JAVA 高级递归
统计该文件夹大小
递归计算 首先传入文件夹 将本层文件夹内所有的文件及文件夹计入数组,循环数组中的变量,如果是文件则累加入累加器,如果是文件夹则继续调用该函数直到遇到文件为止。
package com.heima.test;
import java.io.File;
import java.util.Scanner;
/**
* Code by pureqh on 2021-03-02
* 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小
* 从键盘接收一个文件夹路径
* 1,创建键盘录入对象
* 2,定义一个无限循环
* 3,将键盘录入的结果存储并封装成file对象
* 4,对file对象判断
* 5,将文件夹路径对象返回
*
* 统计该文件夹大小
* 1,定义一个求和变量
* 2,获取该文件夹下所有的文件和文件夹listFiles();
* 3,遍历数组
* 4,判断是文件就计算大小并累加
* 5,判断是文件夹,递归调用
*/
public class Test1 {
public static void main(String[] args) {
File dir = getDir();
System.out.println(getFileLength(dir));
}
/*
* 从键盘接收一个文件夹路径
* 1,返回值类型File
* 2,参数列表无
* */
public static File getDir(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径");
while (true){
//将键盘录入的结果存储并封装成file对象
String line = sc.nextLine();
File dir = new File(line);
//对file对象判断
if(!dir.exists()){
System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径");
}else if(dir.isFile()){
System.out.println("您录入的是一个文件路径,请输入一个文件夹路径");
}else{
return dir;
}
}
}
/*统计该文件夹大小
1,返回值类型
2,参数列表 File dir
* */
public static long getFileLength(File dir){
//1,定义求和变量
long len = 0;
//获取该文件夹下所有的文件和文件夹listFiles
File[] subFiles = dir.listFiles();
//遍历数组
for (File subFile : subFiles) {
if (subFile.isFile()){
len = len + subFile.length();
}else{
len = len +getFileLength(subFile);
}
}
return len;
}
}
import java.io.File;
import java.util.Scanner;
/**
* Code by pureqh on 2021-03-02
* 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小
* 从键盘接收一个文件夹路径
* 1,创建键盘录入对象
* 2,定义一个无限循环
* 3,将键盘录入的结果存储并封装成file对象
* 4,对file对象判断
* 5,将文件夹路径对象返回
*
* 统计该文件夹大小
* 1,定义一个求和变量
* 2,获取该文件夹下所有的文件和文件夹listFiles();
* 3,遍历数组
* 4,判断是文件就计算大小并累加
* 5,判断是文件夹,递归调用
*/
public class Test1 {
public static void main(String[] args) {
File dir = getDir();
System.out.println(getFileLength(dir));
}
/*
* 从键盘接收一个文件夹路径
* 1,返回值类型File
* 2,参数列表无
* */
public static File getDir(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个文件夹路径");
while (true){
//将键盘录入的结果存储并封装成file对象
String line = sc.nextLine();
File dir = new File(line);
//对file对象判断
if(!dir.exists()){
System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径");
}else if(dir.isFile()){
System.out.println("您录入的是一个文件路径,请输入一个文件夹路径");
}else{
return dir;
}
}
}
/*统计该文件夹大小
1,返回值类型
2,参数列表 File dir
* */
public static long getFileLength(File dir){
//1,定义求和变量
long len = 0;
//获取该文件夹下所有的文件和文件夹listFiles
File[] subFiles = dir.listFiles();
//遍历数组
for (File subFile : subFiles) {
if (subFile.isFile()){
len = len + subFile.length();
}else{
len = len +getFileLength(subFile);
}
}
return len;
}
}
删除该文件夹
package com.heima.test;
import java.io.File;
/**
* Code by pureqh on 2021-03-02
* 从键盘接受一个文件夹路径,删除该文件夹
*
* 删除该文件夹
* 1,获取该文件夹下的所有的文件和文件夹
* 2,遍历数组
* 3,判断是文件直接删除
* 4,如果是文件夹,递归调用
* 5,循环结束后,把空文件夹删掉
*/
public class Test2 {
public static void main(String[] args) {
File dir = Test1.getDir();
deleteFile(dir);
}
/*
* 删除该文件夹
* 返回值:void
* 参数列表: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();
}
}
import java.io.File;
/**
* Code by pureqh on 2021-03-02
* 从键盘接受一个文件夹路径,删除该文件夹
*
* 删除该文件夹
* 1,获取该文件夹下的所有的文件和文件夹
* 2,遍历数组
* 3,判断是文件直接删除
* 4,如果是文件夹,递归调用
* 5,循环结束后,把空文件夹删掉
*/
public class Test2 {
public static void main(String[] args) {
File dir = Test1.getDir();
deleteFile(dir);
}
/*
* 删除该文件夹
* 返回值:void
* 参数列表: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.heima.test;
import java.io.*;
/**
* Code by pureqh on 2021-03-02
* 需求:从键盘接收两个文件夹路径,从一个文件夹复制所有的东西到另一个文件夹
*
* 拷贝
* 分析
* 1,在目标文件夹中创建原文件夹
* 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
* 3,遍历数组
* 4,如果是文件就用IO流读写
* 5,如果是文件夹就递归调用
*/
public class Test3 {
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
* */
private static void copy(File src, File dest) throws IOException {
//在目标文件夹中创建原文件夹
File newDir = new File(dest,src.getName());
newDir.mkdir();
//获取原文件夹中所有的文件和文件夹,存储在File数组中
File[] subFiles = src.listFiles();
//遍历数组
for (File subFile:subFiles
) {
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();
}else{
copy(subFile,newDir);
}
}
}
}
import java.io.*;
/**
* Code by pureqh on 2021-03-02
* 需求:从键盘接收两个文件夹路径,从一个文件夹复制所有的东西到另一个文件夹
*
* 拷贝
* 分析
* 1,在目标文件夹中创建原文件夹
* 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
* 3,遍历数组
* 4,如果是文件就用IO流读写
* 5,如果是文件夹就递归调用
*/
public class Test3 {
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
* */
private static void copy(File src, File dest) throws IOException {
//在目标文件夹中创建原文件夹
File newDir = new File(dest,src.getName());
newDir.mkdir();
//获取原文件夹中所有的文件和文件夹,存储在File数组中
File[] subFiles = src.listFiles();
//遍历数组
for (File subFile:subFiles
) {
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();
}else{
copy(subFile,newDir);
}
}
}
}
按层级打印
package com.heima.test;
import java.io.File;
/**
* Code by pureqh on 2021-03-02
* 需求:从键盘接收一个文件夹路径,把文件夹中的所有文件及文件夹的名字按层级打印
*
* 分析:
* 1,获取所有文件和文件夹,返回的File数组
* 2,遍历数组
* 3,无论是文件还是文件夹都需要直接打印
* 4,如果是文件夹,递归调用
*/
public class Test4 {
public static void main(String[] args) {
File dir = Test1.getDir(); //获取文件夹路径
printLev(dir,0);
}
public static void printLev(File dir,int lev) {
//获取所有文件和文件夹,返回的File数组
File[] subFiles = dir.listFiles();
//遍历数组
for (File subFile: subFiles
) {
String headStr = "";
for (int i = 0; i <=lev ; i++) {
headStr +="\t";
}
System.out.println(headStr + subFile.getName());
//无论是文件还是文件夹都需要直接打印
System.out.println(subFile);
if (subFile.isDirectory()){
printLev(subFile,lev+1);
}
}
}
}
import java.io.File;
/**
* Code by pureqh on 2021-03-02
* 需求:从键盘接收一个文件夹路径,把文件夹中的所有文件及文件夹的名字按层级打印
*
* 分析:
* 1,获取所有文件和文件夹,返回的File数组
* 2,遍历数组
* 3,无论是文件还是文件夹都需要直接打印
* 4,如果是文件夹,递归调用
*/
public class Test4 {
public static void main(String[] args) {
File dir = Test1.getDir(); //获取文件夹路径
printLev(dir,0);
}
public static void printLev(File dir,int lev) {
//获取所有文件和文件夹,返回的File数组
File[] subFiles = dir.listFiles();
//遍历数组
for (File subFile: subFiles
) {
String headStr = "";
for (int i = 0; i <=lev ; i++) {
headStr +="\t";
}
System.out.println(headStr + subFile.getName());
//无论是文件还是文件夹都需要直接打印
System.out.println(subFile);
if (subFile.isDirectory()){
printLev(subFile,lev+1);
}
}
}
}
斐波那契数列
package com.heima.test;
/**
* Code by pureqh on 2021-03-02
* 斐波那契数列
*/
public class Test5 {
public static void main(String[] args) {
//demo1();
System.out.println(fun(8));
}
private static void demo1() {
int[] arr = new int[8];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i <arr.length ; i++) {
arr[i] = arr[i-2] +arr[i-1];
}
System.out.println(arr[arr.length-1]);
}
public static int fun(int num){
if(num == 1 || num == 2){
return 1;
}else{
return fun(num -2) + fun(num -1);
}
}
}
/**
* Code by pureqh on 2021-03-02
* 斐波那契数列
*/
public class Test5 {
public static void main(String[] args) {
//demo1();
System.out.println(fun(8));
}
private static void demo1() {
int[] arr = new int[8];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i <arr.length ; i++) {
arr[i] = arr[i-2] +arr[i-1];
}
System.out.println(arr[arr.length-1]);
}
public static int fun(int num){
if(num == 1 || num == 2){
return 1;
}else{
return fun(num -2) + fun(num -1);
}
}
}
1000的阶乘所有零和尾部零的个数
package com.heima.test;
import java.math.BigInteger;
/**
* Code by pureqh on 2021-03-02
* 1000的阶乘所有零和尾部零的个数
*/
public class Test6 {
public static void main(String[] args) {
//demo1();
demo2();
}
/*
* 获取1000的阶乘尾部0*/
private static void demo2() {
BigInteger bi1 = new BigInteger("1");
for (int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2); //将bi1与bi2相乘的结果赋值给bi1
}
String str = bi1.toString(); //获取字符串表现形式
StringBuilder sb = new StringBuilder(str);
str=sb.reverse().toString(); //链式编程
int count = 0 ; //定义计数器
for (int i = 0; i <str.length() ; i++) {
if ('0'!=str.charAt(i)){
break;
}else{
count++;
}
}
System.out.println(count);
}
/*
* 求所有0
* */
private static void demo1() {
BigInteger bi1 = new BigInteger("1");
for (int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2); //将bi1与bi2相乘的结果赋值给bi1
}
System.out.println(bi1);
String str = bi1.toString(); //获取字符串表现形式
int count = 0;
for (int i = 0; i <str.length() ; i++) {
if ('0'==str.charAt(i)){ //如果字符串中出现了0字符,计数器加1
count++;
}
}
System.out.println(count);
}
}
import java.math.BigInteger;
/**
* Code by pureqh on 2021-03-02
* 1000的阶乘所有零和尾部零的个数
*/
public class Test6 {
public static void main(String[] args) {
//demo1();
demo2();
}
/*
* 获取1000的阶乘尾部0*/
private static void demo2() {
BigInteger bi1 = new BigInteger("1");
for (int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2); //将bi1与bi2相乘的结果赋值给bi1
}
String str = bi1.toString(); //获取字符串表现形式
StringBuilder sb = new StringBuilder(str);
str=sb.reverse().toString(); //链式编程
int count = 0 ; //定义计数器
for (int i = 0; i <str.length() ; i++) {
if ('0'!=str.charAt(i)){
break;
}else{
count++;
}
}
System.out.println(count);
}
/*
* 求所有0
* */
private static void demo1() {
BigInteger bi1 = new BigInteger("1");
for (int i = 1; i <= 1000; i++) {
BigInteger bi2 = new BigInteger(i+"");
bi1 = bi1.multiply(bi2); //将bi1与bi2相乘的结果赋值给bi1
}
System.out.println(bi1);
String str = bi1.toString(); //获取字符串表现形式
int count = 0;
for (int i = 0; i <str.length() ; i++) {
if ('0'==str.charAt(i)){ //如果字符串中出现了0字符,计数器加1
count++;
}
}
System.out.println(count);
}
}
约瑟夫环
package com.heima.test;
import java.util.ArrayList;
/**
* Code by pureqh on 2021-03-03
* 约瑟夫环
*/
public class Test8 {
public static void main(String[] args) {
System.out.println(getLuckyNam(8));
}
/*
* 获取幸运数字
* 1,返回值类型int
* 2,参数列表int num
* */
public static int getLuckyNam(int num){
ArrayList<Integer> list = new ArrayList<>(); //创建集合1到num的对象
for (int i = 1; i <=num ; i++) {
list.add(i); //将1到num存储到集合中
//System.out.println(list);
}
int count = 1; //计数器 只要是3的倍数就remove
for (int i = 0; list.size() != 1 ; i++) { //只要集合超过1就一直remove
if (i == list.size()){ //如果i增长到姬和最大索引加1时
i = 0; //重新归零
}
if (count % 3 == 0){ //如果是3的倍数就remove
list.remove(i);
i--;
}
count++;
}
return list.get(0);
}
}
import java.util.ArrayList;
/**
* Code by pureqh on 2021-03-03
* 约瑟夫环
*/
public class Test8 {
public static void main(String[] args) {
System.out.println(getLuckyNam(8));
}
/*
* 获取幸运数字
* 1,返回值类型int
* 2,参数列表int num
* */
public static int getLuckyNam(int num){
ArrayList<Integer> list = new ArrayList<>(); //创建集合1到num的对象
for (int i = 1; i <=num ; i++) {
list.add(i); //将1到num存储到集合中
//System.out.println(list);
}
int count = 1; //计数器 只要是3的倍数就remove
for (int i = 0; list.size() != 1 ; i++) { //只要集合超过1就一直remove
if (i == list.size()){ //如果i增长到姬和最大索引加1时
i = 0; //重新归零
}
if (count % 3 == 0){ //如果是3的倍数就remove
list.remove(i);
i--;
}
count++;
}
return list.get(0);
}
}