具有不返回值的函数的递归

时间:2014-10-23 14:24:45

标签: java recursion

我有一个函数,我想我理解为什么它每次都会返回“hi”,但除了将值设置为该类的本地成员之外,我不知道如何处理它。

private String findDataFolder(File folder) {
    if (folder != null) {
        if (folder.listFiles() != null) {
            for (File file : folder.listFiles()) {
                if (file.isFile()) {

                    if (file.getParent().contains(
                            DATA_DIRECTORY)) {
                        System.out.println("is this happening");
                        String result = file.getParent();
                        return result;
                    }
                } else {
                    findDataFolder(file);
                }
            }
        }
    }
    return "hi";
}

“isthishappening”IS每次输出,但是,递归的最底部部分没有返回,最后调用它是,'hi'我知道它是如何预期但是想知道是否有一种返回值'备份'的方法。我之前已经避免过这样做,只是设置一个私人成员,但知道如何不再这样做会很高兴

编辑:删除了removeExtraDirectoryInformation函数,因为它不是真的相关而且只是噪音

2 个答案:

答案 0 :(得分:2)

我刚刚意识到当前代码中存在一个额外的缺陷。因为您正在进行分支搜索,我们需要做一些其他事情而不是直接返回分支。

private String findDataFolder(File folder) {
    if (folder != null) {
        if (folder.listFiles() != null) {
            for (File file : folder.listFiles()) {
                if (file.isFile()) {
                    if (file.getParent().contains(
                            DATA_DIRECTORY)) {
                        System.out.println("is this happening");
                        String result = file.getParent();
                        return result;
                    }
                } else {
                    String result = findDataFolder(file);
                    if(!result.equals("hi"))
                        return result;
                }
            }
        }
    }
    return "hi";
}

所以基本上,这不是线性递归,而是复合递归(或者它被调用的任何东西。)因为你使用for-loop,我们有多个文件,但最初的解决方案我提供只会返回第一个for循环的结果,这不是我们正在寻找的。

一种选择是跟踪数组或列表中的所有内容。但是,由于目标是找到正确的文件夹,我会假设只有一个正确的答案,我们一找到它就会发现,我们会将其发送到根

您返回"hi"的部分确实很有用,我们知道" hi"不是文件夹路径。找到文件夹后,它会立即将结果发送到递归树。如果没有找到," hi"将返回,上面的for循环可以继续到下一个文件夹。

答案 1 :(得分:2)

每次调用递归函数时,都必须检查是否找到了正确的目录:

private String findDataFolder(File folder) {
    if (folder != null) {
        if (folder.listFiles() != null) {
            for (File file : folder.listFiles()) {
                if (file.isFile()) {

                    if (file.getParent().contains(
                            DATA_DIRECTORY)) {
                        System.out.println("is this happening");
                        String result = file.getParent();
                        return result;
                    }
                } else {
                    String result = findDataFolder(file);
                    if (!("hi").equals(result)) { // check if we found the right directory, if so return it
                        return result;
                    }
                }
            }
        }
    }
    return "hi";
}