在java中的递归函数中返回值

时间:2013-11-28 06:18:11

标签: java recursion

这是一个简单的函数,搜索给定文件夹中的文件及其子文件夹我能够找到该文件但不知何故返回值为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;
}

2 个答案:

答案 0 :(得分:2)

假设你正在寻找以下文件夹中的a.txt:

root
    sub1
        b.txt
    sub2
        a.txt

您的算法的作用是

  1. 以root身份列出文件。返回sub1和sub2。
  2. 遍历文件。如果文件是目录,则在此目录中返回方法的结果
  3. 因此,该算法将仅在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 {
            ...
        }
    }
    

答案 1 :(得分:2)

我使用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;
}