Java——递归练习
#練習(xí)一:從鍵盤接收一個(gè)文件夾路徑,統(tǒng)計(jì)該文件夾大小
###分析:
####每句話相當(dāng)與每一個(gè)要求,每一個(gè)要求用一個(gè)方法去實(shí)現(xiàn)
第一個(gè)方法
* getDir()* 第一個(gè)要求:從鍵盤接收一個(gè)文件夾路徑* 1,創(chuàng)建鍵盤錄入對(duì)象* 2,定義一個(gè)無(wú)限循環(huán)* 3,將鍵盤錄入的結(jié)果存儲(chǔ)并封裝成File對(duì)象* 4,對(duì)File對(duì)象判斷* 5,將文件夾路徑對(duì)象返回第二個(gè)方法
* getFileLength(File dir),傳入第一個(gè)方法所輸入并且經(jīng)過(guò)判斷篩選之后的文件夾路徑File dir* 第二個(gè)要求:統(tǒng)計(jì)該文件夾大小* 1,定義一個(gè)求和變量* 2,獲取該文件夾下所有的文件和文件夾 ListFiles();* 3,遍歷數(shù)組* 4,判斷如果是文件,就計(jì)算大小并累加* 5,判斷如果是文件夾,就遞歸調(diào)用 只有是文件夾才進(jìn)行遞歸調(diào)用,是因?yàn)?#xff0c;文件夾大小不能直接獲取,而文件可以直接獲取字節(jié)個(gè)數(shù)具體代碼如下:
package com.yy.test;import java.io.File; import java.util.Scanner;public class Test1 {/*** 需求:* 1,從鍵盤接收一個(gè)文件夾路徑,統(tǒng)計(jì)該文件夾大小* * 第一個(gè)方法* getDir()* 第一個(gè)要求:從鍵盤接收一個(gè)文件夾路徑* 1,創(chuàng)建鍵盤錄入對(duì)象* 2,定義一個(gè)無(wú)限循環(huán)* 3,將鍵盤錄入的結(jié)果存儲(chǔ)并封裝成File對(duì)象* 4,對(duì)File對(duì)象判斷* 5,將文件夾路徑對(duì)象返回* * 第二個(gè)方法* getFileLength(File dir),傳入第一個(gè)方法所輸入并且經(jīng)過(guò)判斷篩選之后的文件夾路徑File dir* 第二個(gè)要求:統(tǒng)計(jì)該文件夾大小* 1,定義一個(gè)求和變量* 2,獲取該文件夾下所有的文件和文件夾 ListFiles();* 3,遍歷數(shù)組* 4,判斷如果是文件,就計(jì)算大小并累加* 5,判斷如果是文件夾,就遞歸調(diào)用 只有是文件夾才進(jìn)行遞歸調(diào)用,是因?yàn)?#xff0c;文件夾大小不能直接獲取,而文件可以直接獲取字節(jié)個(gè)數(shù)* * */public static void main(String[] args) {File dir = getDir(); //調(diào)用第一個(gè)方法,直接獲取文件夾System.out.println(getFileLength(dir));/*File dir = new File("F:\\wps"); //返回結(jié)果為0,也就是不能直接獲取文件夾大小System.out.println(dir.length()); //直接獲取文件夾的結(jié)果為0*/}/*** 從鍵盤接收一個(gè)文件夾路徑* 方法分析:* 1,返回值類型為File 獲取文件夾路徑,所以返回值類型是File* 2,參數(shù)列表無(wú)* */public static File getDir(){Scanner wsq = new Scanner(System.in); //創(chuàng)建鍵盤錄入對(duì)象System.out.println("請(qǐng)輸入一個(gè)文件路徑:"); //輸出一個(gè)提示語(yǔ)句while(true){ //定義一個(gè)無(wú)限循環(huán)String line = wsq.nextLine(); //將鍵盤錄入的結(jié)果存儲(chǔ)到line里;String nextLine():此掃描器執(zhí)行當(dāng)前行,并返回跳過(guò)的輸入信息。 此方法返回當(dāng)前行的其余部分,不包括結(jié)尾處的行分隔符。當(dāng)前位置移至下一行的行首。File dir = new File(line); //并將line封裝成File對(duì)象dirif(!dir.exists()){ //對(duì)File對(duì)象dir,進(jìn)行判斷,如果錄入的文件夾路徑不存在 ;boolean exists():當(dāng)且僅當(dāng)此抽象路徑名表示的文件或目錄存在時(shí),返回 true;否則返回 false System.out.println("您錄入的文件夾路徑不存在,請(qǐng)輸入一個(gè)文件夾路徑: "); //給予提示}else if(dir.isFile()){ //對(duì)File對(duì)象dir,進(jìn)行判斷,如果錄入的是文件路徑;boolean isFile():當(dāng)且僅當(dāng)此抽象路徑名表示的文件存在且 是一個(gè)標(biāo)準(zhǔn)文件時(shí),返回 true;否則返回 false System.out.println("您錄入的是文件路徑,請(qǐng)輸入一個(gè)文件夾路徑: "); //給予提示}else { //對(duì)File對(duì)象dir,進(jìn)行判斷,錄入的是文件夾路徑return dir; //將文件夾路徑對(duì)象返回}}}/*** 統(tǒng)計(jì)該文件夾大小* 方法分析:* 1,返回值類型long length()方法的返回值是long* 2,參數(shù)列表File dir* */public static long getFileLength(File dir){long len = 0; //定義一個(gè)求和變量File [] subFiles = dir.listFiles(); //獲取該文件夾下所有的文件和文件夾 ;File[] listFiles():返回一個(gè)抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中的文件。for (File subFile : subFiles) { //遍歷數(shù)組;使用增強(qiáng)for循環(huán)遍歷 if(subFile.isFile()){ //判斷如果是文件len = len + subFile.length(); //就計(jì)算大小并累加到求和變量len上}else{ //判斷如果是文件夾len = len + getFileLength(subFile); //就再次調(diào)用該方法,進(jìn)行遞歸調(diào)用;不能直接獲取文件夾大小,文件可以直接獲取字節(jié)個(gè)數(shù)}}return len; //最后,返回求和變量len的值} }#練習(xí)二:從鍵盤接收一個(gè)文件夾路徑,刪除該文件夾;(刪除要慎重,因?yàn)閯h除的內(nèi)容不經(jīng)過(guò)回收站)
####分析:
*1,獲取該文件夾下的所有的文件和文件夾
*2,遍歷數(shù)組
*3,判斷是文件直接刪除
*4,如果是文件夾,遞歸調(diào)用
*5,循環(huán)結(jié)束后,把空文件夾刪掉
#練習(xí)三:從鍵盤接收兩個(gè)文件夾路徑,把其中一個(gè)文件夾中(包含內(nèi)容)拷貝到另一個(gè)文件夾中
###例如,第一次錄入的文件夾路徑是 F:\wsq ,第二個(gè)錄入的文件夾路徑是 F:\yy
運(yùn)行結(jié)束之后,就是在 F:\yy 該路徑下重新將 wsq 文件夾全部拷貝下來(lái);
###F:\yy\wsq,其中yy是父級(jí)路徑,wsq是子級(jí)路徑
分析:
- 1,在目標(biāo)文件夾中創(chuàng)建原文件夾 原文件夾 原文件夾
- 2,獲取原文件夾中所有的文件和文件夾,存儲(chǔ)在File數(shù)組中
- 3,遍歷數(shù)組
- 4,如果是文件就用IO流讀寫 IO流只能讀寫文件不能讀取文件夾
- 5,如果是文件夾,就遞歸調(diào)用
#練習(xí)四:從鍵盤接收一個(gè)文件夾路徑,把文件夾中的所有文件以及文件夾的名字按層級(jí)打印
分析:
- 1,獲取所有文件和文件夾,返回的File數(shù)組
- 2,遍歷數(shù)組
- 3.無(wú)論是文件還是文件夾,都需要直接打印
- 4,如果是文件夾,遞歸調(diào)用
#練習(xí)五:斐波那契數(shù)列(數(shù)組求跟遞歸求兩種方法)
package com.yy.test;public class Test5 {/*** 不死神兔* 故事得從西元1202年說(shuō)起,話說(shuō)有一位意大利青年,名叫斐波那契。* 在他的一部著作中提出了一個(gè)有趣的問(wèn)題:假設(shè)一對(duì)剛出生的小兔,一個(gè)月后就能長(zhǎng)成大兔,再過(guò)一個(gè)月就能生下一對(duì)小兔,并且此后每個(gè)月都生下一對(duì)小兔* 問(wèn):一對(duì)剛出生的兔子,一年內(nèi)繁殖成多少對(duì)兔子?* 1 1 2 3 5 8 13 21 34 ...... * * * */public static void main(String[] args) { // demo1(); //用數(shù)列求,不用遞推System.out.println(fun(22)); //調(diào)用遞歸方法求}private static void demo1() {//用數(shù)組做不死神兔int [] arr = new int [10];//數(shù)組中第一個(gè)元素和第二個(gè)元素都為1arr[0] = 1;arr[1] = 1;//遍歷數(shù)組對(duì)其他元素賦值for (int i = 2; i < arr.length; i++) {arr [i] = arr[i-2] + arr[i-1];}/*//可以提供循環(huán),全部打印出來(lái)for (int i = 0; i < arr.length; i++) {System.err.println(arr[i]);}*/System.out.println(arr.length-1); //也可以只打印最后一個(gè)月,兔子的對(duì)數(shù)}/*** 用遞歸來(lái)求斐波那契數(shù)列* */public static int fun(int num){if(num == 1 || num == 2){return 1;}else {return fun(num - 1) + fun(num - 2);}} }##練習(xí)六:斐波那契數(shù)列(數(shù)組求跟遞歸求兩種方法)
###①求出1000!所有零的個(gè)數(shù),不用遞歸
###②求出1000!所有零的個(gè)數(shù),用遞歸
/*** 需求:求出1000!尾部零的個(gè)數(shù),用遞歸做* 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);}} }練習(xí)七:約瑟夫環(huán)
故事:從前有個(gè)叫約瑟夫環(huán)的國(guó)王,國(guó)王有一天很高興,就把監(jiān)獄里面的500個(gè)死囚犯帶出來(lái),說(shuō):“你們開(kāi)始排隊(duì),從1開(kāi)始以此報(bào)數(shù),若是3的倍數(shù)就直接拉出去給殺掉,最后剩余1個(gè)人,無(wú)罪釋放。”
問(wèn)題:鍵盤輸入人數(shù),然后進(jìn)排序,從1開(kāi)始以此報(bào)數(shù),若是3的倍數(shù)的人會(huì)被殺掉,后面的人接著報(bào)數(shù)。
例如:10個(gè)人
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 被殺
最后只有一個(gè)人生還,就是 4。
總結(jié)
以上是生活随笔為你收集整理的Java——递归练习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java——集合(Map集合的两种迭代)
- 下一篇: 摩尔庄园猎人小屋在哪