【问题标题】:recursive method inside loop循环内的递归方法
【发布时间】:2014-06-30 21:30:57
【问题描述】:

我想写这样的代码

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;
        }
    }
}

【问题讨论】:

  • 我们知道您的循环体将只运行一次。编译器根本不知道它会运行。鉴于循环是没有意义的(你正在返回任何一种方式),你为什么有一个循环呢?
  • 为什么要循环?在第一次迭代中它返回 ...
  • 也许他希望在方法结束时返回 -1 而不是在 for 中?
  • 你的方法必须总是返回一个 int。编译器认为该方法可能不会返回 int。
  • @Darshana:所以这段代码不能代表你的实际问题。我建议您发布代表代码,否则我们无法帮助您。特别是,您应该考虑如果您没有找到该文件会发生什么。

标签: java for-loop recursion return


【解决方案1】:

您的代码在循环方式上出现问题 - 您在第一次迭代时就停止了,要么报告成功,要么报告失败。你应该继续循环,直到你找到一些东西或用完需要迭代的项目。

我会更改一般结构,使方法中的 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。)

【讨论】:

    【解决方案2】:

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

    正如之前的评论中提到的,简单地在方法的末尾添加一个 return 语句并不能保证你实现了你所需要的

    【讨论】:

    • 正如 OP 所说,“这是虚拟代码。实际上我的代码是递归查找文件。”
    • 我不明白这如何解决问题,我的意思是:你有 192 个代表你可以发布 cmets..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多