Pages

2008/12/06

[Java] 用Recursion撰寫檔案列表

遞迴Recursion是撰寫程式的小技巧,
讓程式中的方法(function)可自行呼叫方法本身,
這樣的做法可以讓程式內容易讀, 程式內容也會比較簡潔.


在學校常被用來做範列就是階乘,
5! = 5 * 4 * 3 * 2 * 1
公式利用遞迴的概念可以換成:
n! = n * (n-1)!
在撰寫遞迴程式時, 要注意必須給定一個條件使其脫離迴圈,
若沒給定條件將導致遞迴變成無窮迴圈.
故在撰寫階乘時,
必須告知當最後一個變數為0時, 必須傳回一個為1的值.
public class Factorial {
    private int num;
    private int result = 1;

    public int factorial(int num) {
        if(num == 0){ // 當變數為0時, 便輸出值等於1, 而不再呼叫factorial()
            result = 1;
            return result;
        } else { 
            result = num * factorial(num-1);
            return result;
        }
    }
}


列出一個系統資料夾中的檔案時,
因為資料夾內不一定只含有檔案, 也可能含有資料夾,
故在處理時也可透過遞迴的概念處理,
其脫離迴圈的條件便是其檔案類型為資料而非資料夾.
import java.io.File;

public class OpenFile {

    public void openFile(File[] fileArr, int space) {
    // 此部分為了讓輸出格式有資料層級感覺, 故在輸出字串前加入空白字元
        String spaceString = "";
        for(int j = 0; j < space; j++) {
            spaceString = spaceString + " ";
        }
        for(int i = 0; i < fileArr.length; i++){
            if(fileArr[i].isDirectory()){ // 若檔案類型為資料夾, 將再次呼叫openFile()
                System.out.println(spaceString + "Driectory: " + fileArr[i].getName());
                String pathName = fileArr[i].getAbsolutePath();
                File file = new File(pathName);
                space++;
                openFile(file.listFiles(), space);
            } else {
                // 若檔案類型為資料, 將輸出資料名稱
                System.out.println(spaceString + "File: " + fileArr[i].getName());
            }
        }
    }
}

No comments: