遞迴

peculiar-發表於2024-03-10

遞迴

方法的遞迴:方法定義中呼叫方法本身的現象

package com.shujia.day14;

/*
    new StringBuffer().append().append()  這個叫方法的鏈式呼叫

    show(fun1()) 方法的巢狀呼叫

    遞迴必備前提:
        1、進入遞迴的入口
        2、方法要有返回值
        3、結束遞迴的出口(如果沒有出口就是死遞迴)

    案例1:
        從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事:n1
            從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事: n2
                從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事: n3
                    從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事: n4
                        從前有座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故事: n5
                        ... n*
         設定出口(結束條件):老和尚圓寂了,山倒了。

    案例2:
        學習大資料,為了找工作,為了賺錢,為了娶媳婦,為了生娃:
            學習大資料,為了找工作,為了賺錢,為了娶媳婦,為了生娃:
                學習大資料,為了找工作,為了賺錢,為了娶媳婦,為了生娃:
                    學習大資料,為了找工作,為了賺錢,為了娶媳婦,為了生娃:
                    ...A
        設定出口(結束條件):娶不到媳婦。

    需求:求5的階乘
 */

public class DiGuiDemo1 {
    public static void main(String[] args) {
        System.out.println(jieCheng(5));

        for (int i = 1; i < 10; i++) {
            System.out.println(i);
        }
    }

//    public static void fun1(){
//        fun1();
//    }

    // 5! = 5*4*3*2*1;
    public static int jieCheng(int number) {
        //結束條件
        if (number == 1) {
            return 1;
        } else {
            return number * jieCheng(--number);
        }

//        return number * jieCheng(--number);// OOM (out of memory)
    }
}

遞迴與File的結合練習1

package com.shujia.day15;
import java.io.File;
/*
    遞迴遍歷E:\\目錄下指定字尾名結尾的檔名稱
    遞迴方法的前提:
        1、要有入口
        2、方法要有返回值(看情況)
        3、要有出口

   分析:
    1、將E盤封裝成File物件
    2、獲取當前目錄下所有的檔案或者資料夾組成的File物件陣列
    3、挨個遍歷每一個File物件
        1)如果是一個檔案,且是以.java字尾的,那就輸出
        2)如果是一個資料夾,回到第2步

 */
public class DiGuiTest1 {
    public static void main(String[] args) {
        File file = new File("E:\\");

        show(file);

    }
    public static void show(File file){
        //獲取當前目錄下所有的檔案或者資料夾組成的File物件陣列
        File[] files = file.listFiles();

        //挨個遍歷每一個File物件
        if(files!=null){
            for (File file1 : files) {
                if(file1.isFile() && file1.getName().endsWith(".java")){
                    System.out.println(file1.getName());
                }else {
                    show(file1);
                }
            }
        }
    }
}

遞迴與File的結合練習2

package com.shujia.day15;
import java.io.File;
/*
    遞迴刪除帶內容的目錄 E:\\data

    分析:
        1、將E:\\data封裝成File物件
        2、獲取File物件下面所有檔案和資料夾組成的File物件陣列
        3、遍歷File物件陣列,判斷是否是檔案或者資料夾
            1)如果是檔案,就直接delete
            2)如果是資料夾,繼續回到第2步

 */
public class DiGuiTest2 {
    public static void main(String[] args) {
        File file = new File("E:\\data");
        deleteFile(file);
    }

    public static void deleteFile(File file) {
        File[] files = file.listFiles();
        if (files != null) {
            for (File file1 : files) {
                if(file1.isFile()){
                    file1.delete();
                }else {
                    deleteFile(file1);
                }
            }
        }
        file.delete();
    }
}

相關文章