最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂Java中的遞歸

 更新時間:2022年10月19日 11:28:57   作者:共飲一杯無  
這篇文章主要為大家詳細(xì)介紹了Java中的遞歸的實(shí)現(xiàn)以及應(yīng)用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下

概述

遞歸:指在當(dāng)前方法內(nèi)調(diào)用自己的這種現(xiàn)象。

遞歸的分類:

  • 遞歸分為兩種,直接遞歸和間接遞歸。
  • 直接遞歸稱為方法自身調(diào)用自己。
  • 間接遞歸可以A方法調(diào)用B方法,B方法調(diào)用C方法,C方法調(diào)用A方法。

注意事項(xiàng)

  • 遞歸一定要有條件限定,保證遞歸能夠停止下來,否則會發(fā)生棧內(nèi)存溢出。
  • 在遞歸中雖然有限定條件,但是遞歸次數(shù)不能太多。否則也會發(fā)生棧內(nèi)存溢出。
  • 構(gòu)造方法,禁止遞歸
public class Demo01DiGui {
	public static void main(String[] args) {
		// a();
		b(1);
	}
	
	/*
	 * 3.構(gòu)造方法,禁止遞歸
	 * 編譯報(bào)錯:構(gòu)造方法是創(chuàng)建對象使用的,不能讓對象一直創(chuàng)建下去
	 */
	public Demo01DiGui() {
		//Demo01DiGui();
	}


	/*
	 * 2.在遞歸中雖然有限定條件,但是遞歸次數(shù)不能太多。否則也會發(fā)生棧內(nèi)存溢出。
	 * 4993
	 * 	Exception in thread "main" java.lang.StackOverflowError
	 */
	private static void b(int i) {
		System.out.println(i);
		//添加一個遞歸結(jié)束的條件,i==5000的時候結(jié)束
		if(i==5000){
			return;//結(jié)束方法
		}
		b(++i);
	}

	/*
	 * 1.遞歸一定要有條件限定,保證遞歸能夠停止下來,否則會發(fā)生棧內(nèi)存溢出。 Exception in thread "main"
	 * java.lang.StackOverflowError
	 */
	private static void a() {
		System.out.println("a方法");
		a();
	}
}

遞歸累加求和

計(jì)算1 ~ n的和

分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定義成一個方法,遞歸調(diào)用。 實(shí)現(xiàn)代碼

public class DiGuiDemo {
	public static void main(String[] args) {
		//計(jì)算1~num的和,使用遞歸完成
		int num = 5;
      	// 調(diào)用求和的方法
		int sum = getSum(num);
      	// 輸出結(jié)果
		System.out.println(sum);
		
	}
  	/*
  	  通過遞歸算法實(shí)現(xiàn).
  	  參數(shù)列表:int 
  	  返回值類型: int 
  	*/
	public static int getSum(int num) {
      	/* 
      	   num為1時,方法返回1,
      	   相當(dāng)于是方法的出口,num總有是1的情況
      	*/
		if(num == 1){
			return 1;
		}
      	/*
          num不為1時,方法返回 num +(num-1)的累和
          遞歸調(diào)用getSum方法
        */
		return num + getSum(num-1);
	}
}

代碼執(zhí)行圖解

小貼士:遞歸一定要有條件限定,保證遞歸能夠停止下來,次數(shù)不要太多,否則會發(fā)生棧內(nèi)存溢出。

遞歸求階乘

階乘:所有小于及等于該數(shù)的正整數(shù)的積。

n的階乘:n! = n * (n-1) *...* 3 * 2 * 1

分析:這與累和類似,只不過換成了乘法運(yùn)算,學(xué)員可以自己練習(xí),需要注意階乘值符合int類型的范圍。

推理得出:n! = n * (n-1)!

代碼實(shí)現(xiàn)

public class DiGuiDemo {
  	//計(jì)算n的階乘,使用遞歸完成
    public static void main(String[] args) {
        int n = 3;
      	// 調(diào)用求階乘的方法
        int value = getValue(n);
      	// 輸出結(jié)果
        System.out.println("階乘為:"+ value);
    }
	/*
  	  通過遞歸算法實(shí)現(xiàn).
  	  參數(shù)列表:int 
  	  返回值類型: int 
  	*/
    public static int getValue(int n) {
      	// 1的階乘為1
        if (n == 1) {
            return 1;
        }
      	/*
      	  n不為1時,方法返回 n! = n*(n-1)!
          遞歸調(diào)用getValue方法
      	*/
        return n * getValue(n - 1);
    }
}

遞歸打印多級目錄

分析:多級目錄的打印,就是當(dāng)目錄的嵌套。遍歷之前,無從知道到底有多少級目錄,所以我們還是要使用遞歸實(shí)現(xiàn)。

代碼實(shí)現(xiàn)

public class DiGuiDemo2 {
    public static void main(String[] args) {
      	// 創(chuàng)建File對象
        File dir  = new File("D:\\aaa");
      	// 調(diào)用打印目錄方法
        printDir(dir);
    }

    public static void  printDir(File dir) {
      	// 獲取子文件和目錄
        File[] files = dir.listFiles();
      	// 循環(huán)打印
      	/*
      	  判斷:
      	  當(dāng)是文件時,打印絕對路徑.
      	  當(dāng)是目錄時,繼續(xù)調(diào)用打印目錄的方法,形成遞歸調(diào)用.
      	*/
        for (File file : files) {
    		// 判斷
            if (file.isFile()) {
              	// 是文件,輸出文件絕對路徑
                System.out.println("文件名:"+ file.getAbsolutePath());
            } else {
              	// 是目錄,輸出目錄絕對路徑
                System.out.println("目錄:"+file.getAbsolutePath());
              	// 繼續(xù)遍歷,調(diào)用printDir,形成遞歸
                printDir(file);
            }
        }
    }
}

綜合案例

文件搜索

搜索D:\aaa 目錄中的.java 文件。 分析

  • 目錄搜索,無法判斷多少級目錄,所以使用遞歸,遍歷所有目錄。
  • 遍歷目錄時,獲取的子文件,通過文件名稱,判斷是否符合條件。

代碼實(shí)現(xiàn)

public class DiGuiDemo3 {
    public static void main(String[] args) {
        // 創(chuàng)建File對象
        File dir  = new File("D:\\aaa");
      	// 調(diào)用打印目錄方法
        printDir(dir);
    }

    public static void printDir(File dir) {
      	// 獲取子文件和目錄
        File[] files = dir.listFiles();
      	
      	// 循環(huán)打印
        for (File file : files) {
            if (file.isFile()) {
              	// 是文件,判斷文件名并輸出文件絕對路徑
                if (file.getName().endsWith(".java")) {
                    System.out.println("文件名:" + file.getAbsolutePath());
                }
            } else {
                // 是目錄,繼續(xù)遍歷,形成遞歸
                printDir(file);
            }
        }
    }
}

文件過濾器優(yōu)化

java.io.FileFilter是一個接口,是File的過濾器。 該接口的對象可以傳遞給File類的listFiles(FileFilter) 作為參數(shù), 接口中只有一個方法。 boolean accept(File pathname) :測試pathname是否應(yīng)該包含在當(dāng)前File目錄中,符合則返回true。

分析

1.接口作為參數(shù),需要傳遞子類對象,重寫其中方法。我們選擇匿名內(nèi)部類方式,比較簡單。

2.accept方法,參數(shù)為File,表示當(dāng)前File下所有的子文件和子目錄。保留住則返回true,過濾掉則返回false。保留規(guī)則:

  • 要么是.java文件。
  • 要么是目錄,用于繼續(xù)遍歷。

3.通過過濾器的作用,listFiles(FileFilter)返回的數(shù)組元素中,子文件對象都是符合條件的,可以直接打印。

代碼實(shí)現(xiàn):

public class DiGuiDemo4 {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa");
        printDir2(dir);
    }
  
    public static void printDir2(File dir) {
      	// 匿名內(nèi)部類方式,創(chuàng)建過濾器子類對象
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".java")||pathname.isDirectory();
            }
        });
      	// 循環(huán)打印
        for (File file : files) {
            if (file.isFile()) {
                System.out.println("文件名:" + file.getAbsolutePath());
            } else {
                printDir2(file);
            }
        }
    }
}

Lambda優(yōu)化

分析:FileFilter是只有一個方法的接口,因此可以用lambda表達(dá)式簡寫。 lambda格式:

()->{ }

代碼實(shí)現(xiàn):

public static void printDir3(File dir) {
  	// lambda的改寫
    File[] files = dir.listFiles(f ->{ 
      	return f.getName().endsWith(".java") || f.isDirectory(); 
    });
  	
	// 循環(huán)打印
    for (File file : files) {
        if (file.isFile()) {
            System.out.println("文件名:" + file.getAbsolutePath());
      	} else {
        	printDir3(file);
      	}
    }
}

以上就是一文帶你搞懂Java中的遞歸的詳細(xì)內(nèi)容,更多關(guān)于Java遞歸的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中遍歷Map的多種方法示例及優(yōu)缺點(diǎn)總結(jié)

    Java中遍歷Map的多種方法示例及優(yōu)缺點(diǎn)總結(jié)

    在java中遍歷Map有不少的方法,下面這篇文章主要給大家介紹了關(guān)于Java中遍歷Map的多種方法,以及各種方法的優(yōu)缺點(diǎn)總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • java跳出循環(huán)的三種方式總結(jié)(break語句、continue語句和return語句)

    java跳出循環(huán)的三種方式總結(jié)(break語句、continue語句和return語句)

    在實(shí)際編程中,有時需要在條件語句匹配的時候跳出循環(huán),下面這篇文章主要給大家介紹了關(guān)于java跳出循環(huán)的三種方式,其中包括break語句、continue語句和return語句的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 利用Jackson實(shí)現(xiàn)數(shù)據(jù)脫敏的示例詳解

    利用Jackson實(shí)現(xiàn)數(shù)據(jù)脫敏的示例詳解

    在我們的企業(yè)項(xiàng)目中,為了保護(hù)用戶隱私,數(shù)據(jù)脫敏成了必不可少的操作,那么我們怎么優(yōu)雅的利用Jackson實(shí)現(xiàn)數(shù)據(jù)脫敏呢,本文就來和大家詳細(xì)聊聊,希望對大家有所幫助
    2023-05-05
  • Java IO中字節(jié)流復(fù)制圖片實(shí)現(xiàn)代碼

    Java IO中字節(jié)流復(fù)制圖片實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java IO中字節(jié)流復(fù)制圖片實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 通過實(shí)例分析java多態(tài)

    通過實(shí)例分析java多態(tài)

    這篇文章主要介紹了通過實(shí)例分析java多態(tài),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • 將java普通項(xiàng)目打包成exe可執(zhí)行文件的步驟記錄

    將java普通項(xiàng)目打包成exe可執(zhí)行文件的步驟記錄

    將JAVA代碼打包為exe文件,會讓程序運(yùn)行更加方便,這篇文章主要給大家介紹了關(guān)于將java普通項(xiàng)目打包成exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Java 基礎(chǔ)面試真題:String 為什么是不可變的?

    Java 基礎(chǔ)面試真題:String 為什么是不可變的?

    本文主要介紹了String、StringBuffer和StringBuilder的區(qū)別,以及String不可變的原因,String不可變的原因是其內(nèi)部使用final修飾的char數(shù)組保存字符串,同時String類沒有提供修改字符串的方法,在Java9之后,String的底層實(shí)現(xiàn)由char[]改成了byte[],這是為了節(jié)省內(nèi)存空間
    2025-01-01
  • Golang Protocol Buffer案例詳解

    Golang Protocol Buffer案例詳解

    這篇文章主要介紹了Golang Protocol Buffer案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java并發(fā)的CAS原理與ABA問題的講解

    Java并發(fā)的CAS原理與ABA問題的講解

    今天小編就為大家分享一篇關(guān)于Java并發(fā)的CAS原理與ABA問題的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題及解決方案

    MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題及解決方案

    windows系統(tǒng)打開README.md文件,每次都需要右鍵選擇notepad打開,感覺很麻煩,然后就把README.md文件打開方式默認(rèn)選擇了notepad,這樣每次雙擊就能打開,感覺很方便,這篇文章主要介紹了MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題,需要的朋友可以參考下
    2024-03-03

最新評論

教育| 长顺县| 平顺县| 唐河县| 弋阳县| 德格县| 治多县| 玉溪市| 连云港市| 夏河县| 简阳市| 西畴县| 兴化市| 星座| 博兴县| 台东县| 大丰市| 西宁市| 阳信县| 新津县| 锡林郭勒盟| 达孜县| 邵阳县| 克山县| 彰武县| 确山县| 体育| 中牟县| 福安市| 改则县| 碌曲县| 上饶市| 永泰县| 霍城县| 南康市| 德令哈市| 萨迦县| 太和县| 麻阳| 新野县| 岑溪市|