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

Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)

 更新時間:2023年02月28日 14:52:52   作者:學(xué)全棧的灌湯包  
方法遞歸方法直接調(diào)用自己或者間接調(diào)用自己的形式稱為方法遞歸( recursion),遞歸做為一種算法在程序設(shè)計語言中廣泛應(yīng)用,這篇文章主要介紹了Java方法遞歸的形式和常見遞歸算法-方法遞歸結(jié)合File類查找文件,需要的朋友可以參考下

方法遞歸

方法遞歸的形式

什么是方法遞歸?

方法直接調(diào)用自己或者間接調(diào)用自己的形式稱為方法遞歸( recursion)。

遞歸做為一種算法在程序設(shè)計語言中廣泛應(yīng)用。

遞歸的形式:

直接遞歸:方法自己調(diào)用自己。

public static void main(String[] args) {
    test();
}

// 定義一個方法
public static void test() {
    // 直接遞歸方法內(nèi)部調(diào)用自己
    test();
}

間接遞歸:方法調(diào)用其他方法,其他方法又回調(diào)方法自己。

public static void main(String[] args) {
    test1();
}

public static void test1 () {
    // 間接遞歸, 方法內(nèi)部調(diào)用其他方法, 其他方法再調(diào)用此方法
    test2();
}

private static void test2() {
    test1();
}

遞歸存在的問題?

遞歸如果沒有控制好終止,會出現(xiàn)遞歸死循環(huán),導(dǎo)致棧內(nèi)存溢出現(xiàn)象。

遞歸常見的算法

遞歸案例導(dǎo)學(xué)-計算1-n的階乘:

需求:

計算1-n的階乘的結(jié)果,使用遞歸思想解決,我們先從數(shù)學(xué)思維上理解遞歸的流程和核心點(diǎn)。

分析:

把一個復(fù)雜的問題層層轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解。

假如我們認(rèn)為存在一個公式是 f(n) = 1234567*…(n-1)*n;

那么公式等價形式就是: f(n) = f(n-1) *n

如果求的是 1-5的階乘 的結(jié)果,我們手工應(yīng)該應(yīng)該如何應(yīng)用上述公式計算:

f(5) = f(4) * 5
f(4) = f(3) * 4
f(3) = f(2) * 3
f(2) = f(1) * 2
f(1) = 1

當(dāng)f(1)時作為條件退出遞歸

示例代碼:

public static void main(String[] args) {
    System.out.println(f(5));
}

public static int f(int num) {
    if (num == 1) {
        return 1;
    } else {
        return num * f(num - 1);
    }
}

遞歸案例導(dǎo)學(xué)-計算1-n的和

需求:

計算1-n的和的結(jié)果,使用遞歸思想解決,我們先從數(shù)學(xué)思維上理解遞歸的流程和核心點(diǎn)。

分析:

假如我們認(rèn)為存在一個公式是 f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …(n-1) + n;

那么公式等價形式就是: f(n) = f(n-1) + n

遞歸的終結(jié)點(diǎn):f(1) = 1

如果求的是 1-5的和 的結(jié)果,應(yīng)該如何計算。

f(5) = f(4) + 5
f(4) = f(3) + 4
f(3) = f(2) + 3
f(2) = f(1) + 2
f(1) = 1

示例代碼:

public static void main(String[] args) {
    System.out.println(sum(100));
}

public static int sum(int num) {
    if (num == 1) {
        return 1;
    } else {
        return num + sum(num - 1);
    }
}

案例導(dǎo)學(xué)-猴子吃桃問題:

猴子第一天摘下若干桃子,當(dāng)即吃了一半,覺得好不過癮,于是又多吃了一個; 第二天又吃了前天剩余桃子數(shù)量的一半,覺得好不過癮,于是又多吃了一個; 以后每天都是吃前天剩余桃子數(shù)量的一半,覺得好不過癮,又多吃了一個; 等到第10天的時候發(fā)現(xiàn)桃子只有1個了。

需求:

請問猴子第一天摘了多少個桃子?

分析:

整體來看,每一天都是做同一個事件,典型的規(guī)律化問題,考慮遞歸三要素:

遞歸公式(例如第一天桃子的總數(shù)用f(n)表示, f(n+1)代表第二天):

f(n) - f(n)/2 - 1 = f(n+1) 變形可得: f(n)= 2f(n+1) + 2

遞歸終結(jié)點(diǎn):f(10) = 1

難點(diǎn): 使用數(shù)學(xué)思想, 推導(dǎo)出遞歸公式

示例代碼:

public static void main(String[] args) {
    System.out.println(foo(1));
}

public static int foo(int n) {
    if (n == 10) {
        return 1;
    } else {
        return 2 * foo(n + 1) + 2;
    }
}

非規(guī)律遞歸案例

在上述的案例中遞歸算法都是針對存在規(guī)律化的遞歸問題。

有很多問題是非規(guī)律化的遞歸問題,比如文件搜索。如何解決?

  • 非規(guī)律化遞歸問題自己看著辦,需要流程化的編程思維。

案例導(dǎo)學(xué)-文件搜索:

需求:

  • 從電腦某一路徑下,搜索出某個文件名稱并輸出絕對路徑。

分析:

  • 先定位出的應(yīng)該是一級文件對象
  • 遍歷全部一級文件對象,判斷是否是文件
  • 如果是文件,判斷是否是自己想要的
  • 如果是文件夾,需要繼續(xù)遞歸進(jìn)去重復(fù)上述過程

示例代碼:

public class RecursionDemo5 {
    public static void main(String[] args) {
        findFile("demo2.txt", new File("/Users/chenyq/Documents/file_test"));
    }

    /**
     * @param name 搜索的文件名
     * @param dir 搜索的目錄
     * @return
     */
    public static void findFile(String name, File dir) {
        // 判斷目錄是否為空
        if (dir != null && dir.isDirectory()) {
            // 獲取目錄下的一級文件數(shù)組
            File[] files = dir.listFiles();
            // 判斷數(shù)組是否有內(nèi)容
            if (files != null && files.length > 0) {
                // 不為空則遍歷數(shù)組
                for (File file : files) {
                    // 判斷是文件還是文件夾
                    if (file.isFile()) {
                        // 判斷當(dāng)前文件是否是要查找的文件
                        if (file.getName().contains(name)) {
                            System.out.println("文件路徑是: " + file.getAbsolutePath());
                            return;
                        }
                    } else {
                      	// 遞歸查找子目錄
                        findFile(name, file);
                    }
                }
            }
        } else {
            System.out.println("請輸入正確的目錄!");
        }
    }
}

到此這篇關(guān)于Java方法遞歸的形式和常見遞歸算法-方法遞歸結(jié)合File類查找文件的文章就介紹到這了,更多相關(guān)Java方法遞歸和算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat

    詳解Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat

    這篇文章主要介紹了Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat的區(qū)別于用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java開發(fā)之MD5加密算法的實(shí)現(xiàn)

    java開發(fā)之MD5加密算法的實(shí)現(xiàn)

    本篇文章介紹了,java開發(fā)之MD5加密算法的實(shí)現(xiàn)。需要的朋友參考下
    2013-05-05
  • Java使用Apache POI庫讀取Excel表格文檔的示例

    Java使用Apache POI庫讀取Excel表格文檔的示例

    POI庫是Apache提供的用于在Windows下讀寫各類微軟Office文檔的Java庫,這里我們就來看一下Java使用Apache POI庫讀取Excel表格文檔的示例:
    2016-06-06
  • 解決JDK21中用不了TimeUtild問題

    解決JDK21中用不了TimeUtild問題

    在使用TimeUtil時,可能因?yàn)镮DE版本不兼容導(dǎo)致問題,升級IDEA到2023.2以上版本可解決此問題,詳細(xì)步驟可以通過評論區(qū)索取安裝包或直接從官網(wǎng)下載,分享個人經(jīng)驗(yàn),希望對大家有幫助
    2024-10-10
  • Spring條件注解@ConditionnalOnClass的原理分析

    Spring條件注解@ConditionnalOnClass的原理分析

    這篇文章主要介紹了Spring條件注解@ConditionnalOnClass的原理分析,所謂@ConditionalOnClass注解,翻譯過來就是基于class的條件,它為所標(biāo)注的類或方法添加限制條件,當(dāng)該條件的值為true時,其所標(biāo)注的類或方法才能生效,需要的朋友可以參考下
    2023-12-12
  • Spring Boot利用Docker快速部署項(xiàng)目的完整步驟

    Spring Boot利用Docker快速部署項(xiàng)目的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot利用Docker快速部署項(xiàng)目的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • SpringBoot定時任務(wù)參數(shù)運(yùn)行代碼實(shí)例解析

    SpringBoot定時任務(wù)參數(shù)運(yùn)行代碼實(shí)例解析

    這篇文章主要介紹了SpringBoot定時任務(wù)運(yùn)行代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志

    Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志

    這篇文章主要介紹了Spring Cloud gateway 網(wǎng)關(guān)如何攔截Post請求日志的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java基礎(chǔ)入門之IO流

    java基礎(chǔ)入門之IO流

    流是一種抽象概念,它代表了數(shù)據(jù)的無結(jié)構(gòu)化傳遞。。用來進(jìn)行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進(jìn)行輸入輸出
    2021-06-06
  • Java使用泛型Class實(shí)現(xiàn)消除模板代碼

    Java使用泛型Class實(shí)現(xiàn)消除模板代碼

    Class作為實(shí)現(xiàn)反射功能的類,在開發(fā)中經(jīng)常會用到,然而,當(dāng)Class遇上泛型后,事情就變得不是那么簡單了,所以本文就來講講Java如何使用泛型Class實(shí)現(xiàn)消除模板代碼,需要的可以參考一下
    2023-06-06

最新評論

阜城县| 那曲县| 陆丰市| 大理市| 西峡县| 壶关县| 克拉玛依市| 即墨市| 金乡县| 盐亭县| 霞浦县| 临安市| 科技| 岢岚县| 温泉县| 张家川| 衡水市| 宁南县| 芜湖县| 南木林县| 紫金县| 北宁市| 兴安县| 淅川县| 遂川县| 鄯善县| 六安市| 泽普县| 象山县| 醴陵市| 怀远县| 罗田县| 洞头县| 遂溪县| 玛曲县| 茶陵县| 左贡县| 张家川| 方山县| 东兰县| 施秉县|