簡體   English   中英

Java遞歸函數中的返回值

[英]Return values in recursive function in java

這是一個簡單的函數,它可以在給定文件夾及其子文件夾中搜索文件,但是我可以找到該文件,但是返回值是null,有人可以解釋一下當我們使用遞歸函數時堆棧中會發生什么情況。將其與我的情況相關聯會很棒...

File getFileInFolder(File folder, String fileName) {

    //System.out.println(" PathTo : "+folder.getAbsolutePath());
    File [] files = folder.listFiles();

    if (files != null) {

        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                return getFileInFolder(files[i],fileName);
            } else {
                //System.out.println(" file : "+files[i].getName());
                if (files[i].getName().equals(fileName)) {
                System.out.println(" Found file : "+files[i].getName());
                    return files[i];
                }
            }
        }   
    }

    return null;
}

假設您正在以下文件夾中尋找a.txt:

root
    sub1
        b.txt
    sub2
        a.txt

您算法的作用是

  1. 列出根目錄中的文件。 返回sub1和sub2。
  2. 遍歷文件。 如果文件是目錄,則在此目錄上返回方法的結果

因此,該算法將僅在sub1中搜索,並且將返回null。

如果在第一個目錄中找不到該文件,則需要繼續在其他目錄中搜索:

for (int i = 0; i < files.length; i++) {
    if (files[i].isDirectory()) {
        File resultForSubDirectory = getFileInFolder(files[i], fileName);
        if (resultForSubDirectory != null) {
            return resultForSubDirectory;
        } // else: continue looping
    }
    else {
        ...
    }
}

我已經使用bool變量filefound解決了它,並且中斷了堆棧中的所有循環,不知道這是否是最好的方法,但是對我有用

boolean filefound = false;
File getFileInFolder(File folder, String fileName) {
    filefound = false;
    //System.out.println(" PathTo : "+folder.getAbsolutePath());
    File [] files = folder.listFiles();
    File file = null;
    if (files != null) {

        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                file = getFileInFolder(files[i],fileName);
                if(filefound) {
                    file= files[i];
                    break;
                }
            } else {
                //System.out.println(" file : "+files[i].getName());
                if (files[i].getName().equals(fileName)) {
                    System.out.println(" Found file : "+files[i].getName());
                    file= files[i];
                    filefound = true;
                    break;
                }
            }
        }   
    }

    return file;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM