循环内的递归方法

时间:2014-05-13 09:22:30

标签: java for-loop recursion return

我想写一个像这样的代码

public int recursiveMethod() {
    for (int i = 0; i < 10; i++) {
        if (someBool) {
            return recursiveMethod();
        } else {
            return -1;
        }
    }
}

但这会产生编译错误missing return statement。还有其他方法我可以做到这一点。

更新:实际代码

public static File searchFile(File currentFile) {
    File[] results = null;

    if (currentFile.isDirectory()) {
        for (File file : currentFile.listFiles()) {
            if (file.isDirectory()) {
                return searchFile(file);
            } else {
                results = file.getParentFile().listFiles(new FilenameFilter() {
                    public boolean accept(File dir, String name) {
                        return name.toLowerCase().endsWith(".sh");
                    }
                });

                if (results.length > 0) {
                    return results[0];
                } else {
                    return null;
                }
            }
        }
    } else {
        results = currentFile.getParentFile().listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".sh");
            }
        });

        if (results.length > 0) {
            return results[0];
        } else {
            return null;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您的代码以其循环方式被破坏 - 您在第一次迭代时停止报告成功或失败。你 应该继续循环,直到找到一些东西或者用完了一些东西来迭代。

我会更改一般结构,以便方法中的 last 语句为return null; - 因此,只要您返回肯定结果,就可以这样做,但除此之外,您只需要让它它落空了。所以像这样:

public static File searchFile(File currentFile) {
    if (!currentFile.isDirectory()) {
        throw new InvalidArgumentException("Starting point must be a directory");
    }
    for (File file : currentFile.listFiles()) {
        if (file.isDirectory()) {
            File result = searchFile(file);
            if (result != null) {
                return result;
            }
        } else if (file.getName().toLowerCase().endsWith(".sh")) {
            return file;
        }
    }
    // Not found anything: return null to indicate failure (in this branch)
    return null;
}

(我已经删除了对getParentFile()的调用并重新构建了代码以简化。现在它接受一个目录作为起点,但这大大简化了事情,无论如何,IMO会更有意义。)

答案 1 :(得分:0)

什么是someBool? 如果someBool为true且每次调用recursiveMethod(),则调用recursiveMethod(),i的值从0开始并继续调用recursiveMethod()

如前面的评论中所提到的,只需在方法的最后添加一个return语句并不能保证你实现了所需的目标