JAVA-基礎-遞迴

來源:互聯網
上載者:User

標籤:名稱   技術   alt   過濾   方法調用   OLE   傳遞   運算   info   

遞迴,指在當前方法內調用自己的這種現象

public void method(){    System.out.println(“遞迴的示範”);    //在當前方法內調用自己    method();}

 

遞迴分為兩種,直接遞迴和間接遞迴。

 

直接遞迴稱為方法自身調用自己。間接遞迴可以A方法調用B方法,B方法調用C方法,C方法調用A方法。

計算1-n之間的和 遞迴方法

public class DiGuiDemo {    public static void main(String[] args) {        //計算1~num的和,使用遞迴完成        int n = 5;        int sum = getSum(n);        System.out.println(sum);            }    public static int getSum(int n) {        if(n == 1){            return 1;        }        return n + getSum(n-1);    }}

 

注意:遞迴一定要有條件限定,保證遞迴能夠停止下來,否則會發生棧記憶體溢出。

在遞迴中雖然有限定條件,但是遞迴次數不能太多。否則也會發生棧記憶體溢出。

圖解

 

 

       遞迴列印所有子目錄中的檔案路徑

編寫一個方法用來列印指定目錄中的檔案路徑,並進行方法的調用

要求:若指定的目錄有子目錄,那麼把子目錄中的檔案路徑也列印出來

步驟:

 1. 指定要列印的目錄File對象

 2. 調用getFileAll()方法

 3. 擷取指定目錄中的所有File對象

 4. 遍曆得到每一個File對象

 5. 判斷當前File 對象是否是目錄

                          判斷結果為true,說明為目錄,通過遞迴,再次調用步驟2的getFileAll()方法

                          判斷結果為false,說明是檔案,列印檔案的路徑

public class FileDemo2 {    public static void main(String[] args) {        File file = new File("d:\\test");        getFileAll(file);    }    //擷取指定目錄以及子目錄中的所有的檔案    public static void getFileAll(File file) {        File[] files = file.listFiles();        //遍曆目前的目錄下的所有檔案和檔案夾        for (File f : files) {            //判斷當前遍曆到的是否為目錄            if(f.isDirectory()){                //是目錄,繼續擷取這個目錄下的所有檔案和檔案夾                getFileAll(f);            }else{                //不是目錄,說明當前f就是檔案,那麼就列印出來                System.out.println(f);            }        }    }}
       搜尋指定目錄中的.java檔案(含子目錄)

需求:列印指定目錄即所有子目錄中的.java檔案的檔案路徑

要求:編寫一個方法用來列印指定目錄中的.java檔案路徑,並進行方法的調用

若指定的目錄有子目錄,那麼把子目錄中的.java檔案路徑也列印出來

步驟:

         1. 指定要列印的目錄File對象

         2. 調用getFileAll()方法,傳入要列印的目錄File對象

                  2.1 通過FilenameFilter過濾器擷取指定目錄中的所有.java類型的File對象

                  2.2 遍曆得到每一個File對象

                  2.3 判斷當前File 對象是否是目錄

                          判斷結果為true,說明為目錄,通過遞迴,再次調用步驟2的getFileAll()方法

                          判斷結果為false,說明是檔案,列印檔案的路徑

 

 

public class FileDemo4 {    public static void main(String[] args) {        File file = new File("d:\\test");        getFileAll(file);    }    //擷取指定目錄以及子目錄中的所有的檔案    public static void getFileAll(File file) {        File[] files = file.listFiles(MyFileFilter());        //遍曆目前的目錄下的所有檔案和檔案夾        for (File f : files) {            //判斷當前遍曆到的是否為目錄            if(f.isDirectory()){                //是目錄,繼續擷取這個目錄下的所有檔案和檔案夾                getFileAll(f);            }else{                //不是目錄,說明當前f就是檔案,那麼就列印出來                System.out.println(f);            }        }    }}
//定義類實現檔案名稱FilenameFilter過濾器class MyFileFilter implements FilenameFilter{    public boolean accept(File dir, String name) {        return name.endsWith(".java");    }}

 

 

迴圈和遞迴

對於for或者while迴圈,只是將重複的步驟利用迴圈來處理,迴圈處理完一個步驟後,又進行下一個類似的步驟,關鍵點是要找出迴圈的依據和各步驟的相同點(既要迴圈的部分),什麼情況下要繼續迴圈,什麼情況下要終止迴圈,如此例,從1到max有多少的整數就要迴圈多少次,這就是此例的迴圈依據,而此例中進行迴圈的重複操作是累加;
使用遞迴時,需先找出重複步驟之間的相同邏輯,然後將這些邏輯實現在一個方法中。


遞迴是在進行一個步驟,進行到某處時,通過調用自身進行分層,在下一層開始緊接著的下一個步驟,
如果下一層不是定義的最後一層,則會在相同的地方再次分層,直到進入最底層,如上例中,max如果
為5,在進行max為5的這一層操作時,將會運行addByMax(4),分層,下一層的max將為4,此時因為定義了max為1時
才為最底層,所以會繼續分層,這時max為3,再分,為2,再分,為1,到達最底層,然後
從最底層開始將各層的結果一次向上傳遞,迴歸到最頂層,返回最終結果

 

所以遞迴時要注意形成一層一層的結構,一般會採取某種判斷的方法,如if,如果不滿足要求
,那就調用自身進行遞迴,此時應注意找出上下層之間的聯絡(各層相同邏輯的部分),讓運算進入下一層,
這樣形成上一層調用下一層,比如此例中的 max+addByMax(max-1)
最後注意定義一個最底層,即開始向上迴歸結果的那一層,最底層將不再調用自身進行遞迴

JAVA-基礎-遞迴

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.