在递归方法中不必要的返回

时间:2018-04-08 14:13:15

标签: java recursion return

我正在编写递归代码,计算我们需要执行的最小操作数,以使s2等于s1,有效操作为insert 1 character (di),{{1 }和delete 1 character (dc)

dn stays for do nothing

例如,如果我们有s1 =“home”和s2 =“hote”,则会有1个删除操作(对于't'),1个插入操作('m')和3个不做任何操作。

问题是我的语句在那些if / else if分支中被禁止,所以对于我的程序编译我必须在底部放置一个private static int editDistance(String s1, String s2) { if((s2.isEmpty() && (dn == 0 && dc == 0 && di == 0)) || (s1.isEmpty() && (dn == 0 && dc == 0 && di == 0))) return Integer.max(s1.length(), s2.length()); if(s2.isEmpty()) { return 0; } else if(s1.isEmpty()) { dc++; return 1 + editDistance(s1, rest(s2)); } else if(s1.charAt(0) == s2.charAt(0)) { dn++; return editDistance(rest(s1), rest(s2)); } else if(s1.charAt(0) != s2.charAt(0) && dc <= di) { dc++; return 1 + editDistance(s1, rest(s2)); } else if(s1.charAt(0) != s2.charAt(0) && dc > di) { di++; return 1 + editDistance(rest(s1), s2); } return 0; } 语句是没有意义的,我怎么能纠正这个?

3 个答案:

答案 0 :(得分:1)

删除最后一个if。当然,只有当您的案例涵盖所有可能的变体时,您才应该这样做。有时,正确的方法是抛出异常,如果不确定,如果你不计算某些东西,你的程序就不会继续使用不正确的值。

private static int editDistance(String s1, String s2) {

    if((s2.isEmpty() && (dn == 0 && dc == 0 && di == 0)) || (s1.isEmpty() && (dn == 0 && dc == 0 && di == 0)))
        return Integer.max(s1.length(), s2.length());

    if(s2.isEmpty()) {
        return 0;
    } else if(s1.isEmpty()) {
        dc++;
        return 1 + editDistance(s1, rest(s2));
    } else if(s1.charAt(0) == s2.charAt(0)) {
        dn++;
        return editDistance(rest(s1), rest(s2));
    } else if(s1.charAt(0) != s2.charAt(0) && dc <= di) {
        dc++;
        return 1 + editDistance(s1, rest(s2));
    } else {
        di++;
        return 1 + editDistance(rest(s1), s2);
    }
}

答案 1 :(得分:1)

如果这些条件耗尽了所有可能性,我建议你不要删除任何条件(因为该文件说明了程序执行的原因),而是抛出异常 - 例如AssertionError有消息&#34;这不会发生&#34;。

那是因为有时候由于重构或魔法,不应该发生的事情发生,并且最好不要忽略它们而是使应用程序崩溃(因为它在一个不一致的状态)。

Java编译器根本无法检测到不可能的场景(在计算上太昂贵,在某些情况下 - 不可能 - 请参阅&#34;停止问题&#34;)。

答案 2 :(得分:0)

您可以通过两种方式解决此问题:

  1. 如果您删除了最后一条if语句,可能会发生其他可能性

    private static int editDistance(String s1, String s2) {
    
        if((s2.isEmpty() && (dn == 0 && dc == 0 && di == 0)) || (s1.isEmpty() && (dn == 0 && dc == 0 && di == 0)))
            return Integer.max(s1.length(), s2.length());
    
        if(s2.isEmpty()) {
            return 0;
        } else if(s1.isEmpty()) {
            dc++;
            return 1 + editDistance(s1, rest(s2));
        } else if(s1.charAt(0) == s2.charAt(0)) {
            dn++;
            return editDistance(rest(s1), rest(s2));
        } else if(s1.charAt(0) != s2.charAt(0) && dc <= di) {
            dc++;
            return 1 + editDistance(s1, rest(s2));
        } else if(s1.charAt(0) != s2.charAt(0) && dc > di) {
            di++;
            return 1 + editDistance(rest(s1), s2);
        }else
            return 0;
    
    }
    
  2. 如果最后一个if语句涵盖了所有剩余的可能性,只需用else关键字替换最后一个if语句。