Java——递归练习

#练习一:从键盘接收一个文件夹路径,统计该文件夹大小
###分析:
####每句话相当与每一个要求,每一个要求用一个方法去实现

第一个方法
 * getDir()* 第一个要求:从键盘接收一个文件夹路径* 1,创建键盘录入对象* 2,定义一个无限循环* 3,将键盘录入的结果存储并封装成File对象* 4,对File对象判断* 5,将文件夹路径对象返回
第二个方法
 * getFileLength(File dir),传入第一个方法所输入并且经过判断筛选之后的文件夹路径File dir* 第二个要求:统计该文件夹大小* 1,定义一个求和变量* 2,获取该文件夹下所有的文件和文件夹  ListFiles();* 3,遍历数组* 4,判断如果是文件,就计算大小并累加* 5,判断如果是文件夹,就递归调用    只有是文件夹才进行递归调用,是因为,文件夹大小不能直接获取,而文件可以直接获取字节个数

具体代码如下:

package com.yy.test;import java.io.File;
import java.util.Scanner;public class Test1 {/*** 需求:* 1,从键盘接收一个文件夹路径,统计该文件夹大小* * 第一个方法* getDir()* 第一个要求:从键盘接收一个文件夹路径* 1,创建键盘录入对象* 2,定义一个无限循环* 3,将键盘录入的结果存储并封装成File对象* 4,对File对象判断* 5,将文件夹路径对象返回* * 第二个方法* getFileLength(File dir),传入第一个方法所输入并且经过判断筛选之后的文件夹路径File dir* 第二个要求:统计该文件夹大小* 1,定义一个求和变量* 2,获取该文件夹下所有的文件和文件夹  ListFiles();* 3,遍历数组* 4,判断如果是文件,就计算大小并累加* 5,判断如果是文件夹,就递归调用    只有是文件夹才进行递归调用,是因为,文件夹大小不能直接获取,而文件可以直接获取字节个数* * */public static void main(String[] args) {File  dir = getDir();							//调用第一个方法,直接获取文件夹System.out.println(getFileLength(dir));/*File dir = new File("F:\\wps");					//返回结果为0,也就是不能直接获取文件夹大小System.out.println(dir.length());				//直接获取文件夹的结果为0*/}/*** 从键盘接收一个文件夹路径* 方法分析:* 1,返回值类型为File   获取文件夹路径,所以返回值类型是File* 2,参数列表无* */public static File getDir(){Scanner wsq = new Scanner(System.in);								//创建键盘录入对象System.out.println("请输入一个文件路径:");								//输出一个提示语句while(true){														//定义一个无限循环String line = wsq.nextLine();									//将键盘录入的结果存储到line里;String nextLine():此扫描器执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。File dir = new File(line);										//并将line封装成File对象dirif(!dir.exists()){												//对File对象dir,进行判断,如果录入的文件夹路径不存在 ;boolean exists():当且仅当此抽象路径名表示的文件或目录存在时,返回 true;否则返回 false System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径: ");	//给予提示}else if(dir.isFile()){											//对File对象dir,进行判断,如果录入的是文件路径;boolean isFile():当且仅当此抽象路径名表示的文件存在且 是一个标准文件时,返回 true;否则返回 false System.out.println("您录入的是文件路径,请输入一个文件夹路径: ");		//给予提示}else {															//对File对象dir,进行判断,录入的是文件夹路径return dir;													//将文件夹路径对象返回}}}/*** 统计该文件夹大小* 方法分析:* 1,返回值类型long    length()方法的返回值是long* 2,参数列表File dir* */public static long getFileLength(File dir){long len = 0;														//定义一个求和变量File [] subFiles = dir.listFiles();									//获取该文件夹下所有的文件和文件夹 ;File[] listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。for (File subFile : subFiles) {										//遍历数组;使用增强for循环遍历 if(subFile.isFile()){											//判断如果是文件len = len + subFile.length();								//就计算大小并累加到求和变量len上}else{															//判断如果是文件夹len = len + getFileLength(subFile);							//就再次调用该方法,进行递归调用;不能直接获取文件夹大小,文件可以直接获取字节个数}}return len;															//最后,返回求和变量len的值}
}

#练习二:从键盘接收一个文件夹路径,删除该文件夹;(删除要慎重,因为删除的内容不经过回收站)
####分析:
*1,获取该文件夹下的所有的文件和文件夹
*2,遍历数组
*3,判断是文件直接删除
*4,如果是文件夹,递归调用
*5,循环结束后,把空文件夹删掉


package com.yy.test;import java.io.File;public class Test2 {public static void main(String[] args) {File dir = Test1.getDir();				//对方法进行调用,调用Test1里面的getDir()方法,即从键盘接收一个文件夹路径的方法,获取文件夹路径deleteFile(dir);}/**、* 删除文件夹* 方法分析* 1,返回值类型void   因为删除嘛,不需要任何的返回,直接删掉就可以了* 2,参数列表File dir* */public static void deleteFile(File dir){File [] subFiles = dir.listFiles();		//获取该文件夹下的所有的文件和文件夹   listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件for (File subFile : subFiles) {			//遍历数组if(subFile.isFile()){				//判断是文件subFile.delete();				//直接删除}else{								//判断是文件夹deleteFile(subFile);			//递归调用}}dir.delete();							//循环结束后,把空文件夹删掉;若不加这个,只会把文件给删掉,而不会把文件夹给删掉,会留有空文件夹}}

#练习三:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
###例如,第一次录入的文件夹路径是 F:\wsq ,第二个录入的文件夹路径是 F:\yy

运行结束之后,就是在 F:\yy 该路径下重新将 wsq 文件夹全部拷贝下来;

###F:\yy\wsq,其中yy是父级路径,wsq是子级路径

分析:

  • 1,在目标文件夹中创建原文件夹 原文件夹 原文件夹
  • 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
  • 3,遍历数组
  • 4,如果是文件就用IO流读写 IO流只能读写文件不能读取文件夹
  • 5,如果是文件夹,就递归调用
package com.yy.test;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;public class Test3 {
/*** @throws IOException * */public static void main(String[] args) throws IOException {File wsq = Test1.getDir();File yy =  Test1.getDir();if(wsq.equals(yy)){System.out.println("目标文件夹是原文件夹的子文件夹");}else{copy(wsq,yy);}}
/*** 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中* 1,返回值类型void* 2,参数类型File wsq(原),File yy()* @throws IOException * * */
private static void copy(File wsq, File yy) throws IOException {File newDir = new File(yy,wsq.getName());						//在目标文件夹中创建原文件夹// getName():返回由此抽象路径名表示的文件或目录的名称// mkdirs():创建此抽象路径名指定的目录,包括所有必需但不存在的父目录;当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false newDir.mkdir();													//这一步骤完成之后,就相当于在yy文件夹下创建wsq文件File [] subFiles = wsq.listFiles();								//获取原文件夹(wsq)下的所有的文件和文件夹,存储在File数组中for (File subFile : subFiles) {									//遍历数组;if(subFile.isFile()){										//如果是  文件  ,就用IO流(字节流)读写BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));	//输入流;字符流只能拷贝文本,拷贝文件可以是任意的文件,不止是拷贝文本,所以说,只能用字节流,不能用字符流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));		//输出流;getName():返回由此抽象路径名表示的文件或目录的名称int b;while((b = bis.read()) != -1){bos.write(b);}bis.close();											//关流bos.close();											//关流}else{														//如果是  文件夹  ,就递归调用copy(subFile,newDir);}}}}

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

分析:

  • 1,获取所有文件和文件夹,返回的File数组
  • 2,遍历数组
  • 3.无论是文件还是文件夹,都需要直接打印
  • 4,如果是文件夹,递归调用
package com.yy.test;import java.io.File;public class Test4 {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.println("\t");}//3.无论是文件还是文件夹,都需要直接打印System.out.println(subFile);//4,如果是文件夹,递归调用if(subFile.isDirectory()){printLev(subFile,lev + 1);}}}
}

#练习五:斐波那契数列(数组求跟递归求两种方法)

package com.yy.test;public class Test5 {/*** 不死神兔* 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。* 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔,一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生下一对小兔* 问:一对刚出生的兔子,一年内繁殖成多少对兔子?* 1  1  2  3  5  8  13  21  34 ...... * * * */public static void main(String[] args) {
//		demo1();									//用数列求,不用递推System.out.println(fun(22));				//调用递归方法求}private static void demo1() {//用数组做不死神兔int [] arr = new int [10];//数组中第一个元素和第二个元素都为1arr[0] = 1;arr[1] = 1;//遍历数组对其他元素赋值for (int i = 2; i < arr.length; i++) {arr [i] = arr[i-2] + arr[i-1];}/*//可以提供循环,全部打印出来for (int i = 0; i < arr.length; i++) {System.err.println(arr[i]);}*/System.out.println(arr.length-1);				//也可以只打印最后一个月,兔子的对数}/*** 用递归来求斐波那契数列* */public static int fun(int num){if(num == 1 || num == 2){return 1;}else {return fun(num - 1) + fun(num - 2);}}
}

##练习六:斐波那契数列(数组求跟递归求两种方法)
###①求出1000!所有零的个数,不用递归

package com.yy.test;import java.math.BigInteger;public class Test6 {
/*** 需求:求出1000!所有零的个数,不用递归* * * */public static void main(String[] args) {/*int result = 1;for (int i = 0; i <= 1000; i++) {result = result * i;}System.out.println(result);					//最后的输出结果为0,因为1000!远大于int的取值范围,所以输出最后的结果为0*/demo1();demo2();}private static void demo2() {					//获取1000!尾部有多少个零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);
}private static void demo1() {					//求1000!中所有的零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)){count ++;}}System.out.println(count);
}}

###②求出1000!所有零的个数,用递归

/*** 需求:求出1000!尾部零的个数,用递归做* 5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95  100  ...  1000    											1000/5=200* 5 * 5   5 * 5 * 2   5 * 5 * 3   5 * 5 * 4   5 * 5 * 5   5 * 5 * 6                           												200/5=40* 5 * 5 * 5 * 1    5 * 5 * 5 * 2     5 * 5 * 5 * 3    5 * 5 * 5 * 4    5 * 5 * 5 * 5    5 * 5 * 5 * 6   5 * 5 * 5 * 7   5 * 5 * 5 * 8      40/5=8* 5 * 5 * 5 * 5 * 5																														8/5=1 * 																																			200+40+8+1=249* */		
package com.yy.test;public class Test7 {public static void main(String[] args) {System.out.println(fun(1000));}public static int fun(int num){if(num > 0 && num < 5){return 0;}else {return num / 5 + fun(num / 5);}}
}

练习七:约瑟夫环

故事:从前有个叫约瑟夫环的国王,国王有一天很高兴,就把监狱里面的500个死囚犯带出来,说:“你们开始排队,从1开始以此报数,若是3的倍数就直接拉出去给杀掉,最后剩余1个人,无罪释放。”

问题:键盘输入人数,然后进排序,从1开始以此报数,若是3的倍数的人会被杀掉,后面的人接着报数。

例如:10个人

1 2 3 4 5 6 7 8 9 10
11 12 被杀 13 14 被杀 15 16 被杀 17
18 被杀 19 20 被杀 21 22
被杀 23 24 被杀 25
26 被杀 27
28 被杀
最后只有一个人生还,就是 4。

package com.yy.test;import java.util.ArrayList;public class Test8 {public static void main(String[] args) {System.out.println(getLuckluNum(8));}
/*** 获取幸运数字* 1,返回值类型int* 2,参数列表int num* * */public static int getLuckluNum(int num){ArrayList<Integer> list = new ArrayList<>();	//创建集合存储1到num对象for (int i = 1; i <= num; i++) {				//将1到num存储在集合中 list.add(i);						}int count = 1;									//用来数数的,只要是3的倍数就杀人for (int i = 0;  list.size() != 1; i++) {	//只要集合中人数超过1,就要不断地杀if(i == list.size()){						//如果i增长到集合最大的索引+1时i = 0;									//重新归零}if(count % 3 == 0){							//如果是3的倍数就杀人list.remove(i--);}count++;}return list.get(0);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。

得到函数名&#xff1a; System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代码行&#xff0c;源代码文件名&#xff1a; StackTrace st new StackTrace(new StackFrame(true)); Console…

PHP中单引号和双引号的区别

0x01 单引号 单引号里面的内容不会被解释&#xff0c;不管什么内容&#xff0c;都当做字符串处理 <?php$abc1234; $stradc$abc; echo $str;输出 0x02 双引号 双引号里面的内容会被解释&#xff0c;像一些换行&#xff08;\n)、数据元素等都会被解释 <?php$abc1234;…

Eclipse 代码提示无效的解决方法

代码提示一般有两种形势1、点提示无效经常打一个点就能调出该对象可选的方法列表。哪天不灵了&#xff0c;可以这样解决&#xff1a;window->Preferences->Java->Editor->Content Assist->Advanced 上面的选项卡Select the proposal kinds contained in the de…

getdate 日期间隔_日期getDate()方法以及JavaScript中的示例

getdate 日期间隔JavaScript Date getDate()方法 (JavaScript Date getDate() method) getDate() method is a Dates class method and it is used to get the current day of the month. getDate()方法是Date的类方法&#xff0c;用于获取当月的当前日期。 It accepts nothin…

关闭页面时执行“退出”的解决方案

在有些应用中我们需要实时的更新站点用户是否在线的状态。比如一些论坛里的在线成员实时显示&#xff0c;或基于网页的聊天、会议系统等。这种情况下&#xff0c;如果用户点击“退出”按钮或链接&#xff0c;我们将之行一系列后台操作&#xff0c;将该用户标识成off line状态&a…

Java——多线程实现的三种方式

创建新执行线程有三种方法。 第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。 例如&#xff0c;计算大于某一规定值的质数的线程可以写成&#xff1a; class PrimeThread extends Thread {long minPrime;Pri…

python网络编程---TCP客户端

0x01 环境 python2、 pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com tarfet_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接客户端 clien…

c#枚举数字转枚举_C#枚举能力问题和解答 套装4

c#枚举数字转枚举1) What is the correct output of given code snippets in C#.NET? using System;class program{enum emp_salary : int{emp1 10000,emp2 15000,emp4 20000}static void Main(string[] args){int sal (int)emp_salary.emp2;Console.WriteLine(sal);}}100…

Java——匿名内部类实现线程的两种方式

package com.yy.thread;public class Demo4_Thread {public static void main(String[] args) {demo1(); //匿名内部类&#xff0c;第一种&#xff0c;继承Threaddemo2(); //匿名内部类&#xff0c;第二种&#xff0c;实现Runnable接口 }private static void…

zlib1.2.5的编译

zlib1.2.5没有了1.2.4的vc6工程&#xff0c;只好使用命令行编译。通过win32/Makefile.msc发现有4种编译方式&#xff0c;如下&#xff1a;# Usage:# nmake -f win32/Makefile.msc (standard build)# nmake -f win32/Makefile.msc LOC-DFOO …

python网络编程--UDP客户端

0x01 环境 python、pycharm 0x02 程序 # -*- coding:utf-8 -*-import sockettarget_host127.0.0.1 target_part80#创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#发送一些数据 client.sendto(AAAAAA,(target_host,target_part))#接收到的消息 …

window.open参数和技巧

【1、最基本的弹出窗口代码】 <SCRIPT LANGUAGE"javascript"> <!-- window.open (page.html) --> </SCRIPT> 因为着是一段javascripts代码&#xff0c;所以它们应该放在<SCRIPT LANGUAGE"javascript">标签和</script>之间。…

java jar包示例_Java包getImplementationTitle()方法和示例

java jar包示例包类的getImplementationTitle()方法 (Package Class getImplementationTitle() method) getImplementationTitle() method is available in java.lang package. getImplementationTitle()方法在java.lang包中可用。 getImplementationTitle() method is used to…

Java——获取和设置多线程的名称

给名字进行赋值有两种方式&#xff1a; 1&#xff0c;通过构造去赋值 Thread(String name) 直接在构造方法里面传一个名字就行了2&#xff0c;通过set设置的方法进行赋值 package com.yy.threadmethod;public class Demo1_Name {public static void main(String[] args) {dem…

十三、oracle 数据字典和动态性能视图

一、概念数据字典是oracle数据库中最重要的组成部分&#xff0c;它提供了数据库的一些系统信息。动态性能视图记载了例程启动后的相关信息。 二、数据字典1)、数据字典记录了数据库的系统信息&#xff0c;它是只读表和视图的集合&#xff0c;数据字典的所有者为sys用户。2)、用…

python网络编程---TCP服务器

0x01 环境 python2 pycharm 0x02 程序 客户端程序&#xff1a; # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com target_port80target_hostlocalhost target_port3345 dataABCDEF# 创建一个socket对象 client socket.socket(socket.AF_INET,socket.SOCK_STRE…

C# 获取磁盘容量

/// 获取指定驱动器的空间总大小(单位为B) /// </summary> /// <param name"str_HardDiskName">只需输入代表驱动器的字母即可 </param> /// <returns> </returns> public static long GetHardDi…

Java——获取当前线程的对象(currentThread())(两种方式)

package com.yy.threadmethod;public class Demo2_CurrentThread { /*** public static Thread currentThread()返回对当前正在执行的线程对象的引用。 * 返回&#xff1a;当前执行的线程。返回的是一个Thread* 该方法主要是为了协助 实现通过Runnable接口来对线程进行设置…

HDU2501_多米诺骨牌

题目大意&#xff1a; 有一个大小是 2 x n 的网格&#xff0c;现在需要用2种规格的骨牌铺满&#xff0c;骨牌规格分别是 2 x 1 和 2 x 2&#xff0c;请计算一共有多少种铺设的方法。 解题思路&#xff1a; 找出递推公式&#xff1a; f[i] f[i-1] f[i-2] * 2; 代码&#xff1a…

java jar包示例_Java包getSpecificationVendor()方法和示例

java jar包示例包类的getSpecificationVendor()方法 (Package Class getSpecificationVendor() method) getSpecificationVendor() method is available in java.lang package. getSpecificationVendor()方法在java.lang包中可用。 getSpecificationVendor() method is used to…