標籤:名稱 技術 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-基礎-遞迴