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

Java 递归方法中的不必要返回,java,recursion,return,Java,Recursion,Return,我正在编写一个递归代码,计算我们需要执行的最小操作数,以便s2等于s1,有效的操作是insert 1 character(di),delete 1 character(dc)和dn保持不执行任何操作 private static int editDistance(String s1, String s2) { if((s2.isEmpty() && (dn == 0 && dc == 0 && di == 0)) || (s1.isEmp

我正在编写一个递归代码,计算我们需要执行的最小操作数,以便
s2
等于
s1
,有效的操作是
insert 1 character(di)
delete 1 character(dc)
dn保持不执行任何操作

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;

}
private static int editDistance(字符串s1、字符串s2){
if((s2.isEmpty()&&(dn==0&&dc==0&&di==0))| |(s1.isEmpty()&&(dn==0&&dc==0&&di==0)))
返回整数.max(s1.length(),s2.length());
if(s2.isEmpty()){
返回0;
}else if(s1.isEmpty()){
dc++;
返回1+editDistance(s1,rest(s2));
}如果(s1.字符(0)=s2.字符(0)){
dn++;
返回距离(休息(s1),休息(s2));
}如果(s1.字符(0)!=s2.字符(0)&&dc di){
di++;
返回1+editDistance(剩余(s1),s2);
}
返回0;
}
例如,如果我们有s1=“home”和s2=“hote”,那么将有1个删除操作(对于't')、1个插入操作('m')和3个不做任何操作


问题是我的语句在那些if/else if分支中被标注了日期,所以为了让我的程序编译,我不得不在底部放一个
return 0
语句,这是毫无意义的,我该如何纠正呢

如果需要,请删除最后一个。当然,只有当您的案例涵盖所有可能的变体时,您才应该这样做。有时,正确的方法是抛出exception毕竟是if-else,以确保如果不计算某个值,程序不会继续使用错误的值

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);
    }
}
private static int editDistance(字符串s1、字符串s2){
if((s2.isEmpty()&&(dn==0&&dc==0&&di==0))| |(s1.isEmpty()&&(dn==0&&dc==0&&di==0)))
返回整数.max(s1.length(),s2.length());
if(s2.isEmpty()){
返回0;
}else if(s1.isEmpty()){
dc++;
返回1+editDistance(s1,rest(s2));
}如果(s1.字符(0)=s2.字符(0)){
dn++;
返回距离(休息(s1),休息(s2));

}else if(s1.charAt(0)!=s2.charAt(0)&&dc删除last if。当然,您应该只在您的案例涵盖所有可能的变体时执行此操作。有时正确的方法是在所有else之后抛出异常,以确保如果您不计算某些内容,程序不会继续使用错误的值

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);
    }
}
private static int editDistance(字符串s1、字符串s2){
if((s2.isEmpty()&&(dn==0&&dc==0&&di==0))| |(s1.isEmpty()&&(dn==0&&dc==0&&di==0)))
返回整数.max(s1.length(),s2.length());
if(s2.isEmpty()){
返回0;
}else if(s1.isEmpty()){
dc++;
返回1+editDistance(s1,rest(s2));
}如果(s1.字符(0)=s2.字符(0)){
dn++;
返回距离(休息(s1),休息(s2));

}否则,如果(s1.charAt(0)!=s2.charAt(0)&&dc这些条件用尽了所有的可能性,我建议您不要删除任何条件(因为这是程序为什么要这样做的文档),而是抛出一个异常-例如带有消息“这不可能发生”的
AssertionError

这是因为有时由于重构或魔法,不应该发生的事情会发生,最好不要忽略它们,而是让应用程序崩溃(因为它处于不一致的状态)


Java编译器不能总是检测不可能的情况(这在计算上太昂贵,在某些情况下-不可能-请参阅“停止问题”)。

如果这些条件用尽了所有可能,我建议您不要删除任何条件(因为这是程序为什么这样做的文档),而是抛出一个异常-例如带有消息“这不可能发生”的
AssertionError

这是因为有时由于重构或魔法,不应该发生的事情会发生,最好不要忽略它们,而是让应用程序崩溃(因为它处于不一致的状态)


Java编译器无法始终检测不可能的场景(计算成本太高,在某些情况下-不可能-请参阅“停止问题”)。

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

  • 如果删除最后一条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;
    
    }
    
    private static int editDistance(字符串s1、字符串s2){
    if((s2.isEmpty()&&(dn==0&&dc==0&&di==0))| |(s1.isEmpty()&&(dn==0&&dc==0&&di==0)))
    返回整数.max(s1.length(),s2.length());
    if(s2.isEmpty()){
    返回0;
    }else if(s1.isEmpty()){
    dc++;
    返回1+editDistance(s1,rest(s2));
    }如果(s1.字符(0)=s2.字符(0)){
    dn++;
    返回距离(休息(s1),休息(s2));
    }如果(s1.字符(0)!=s2.字符(0)&&dc di){
    di++;
    返回1+editDistance(剩余(s1),s2);
    }否则
    返回0;
    }
    
  • 如果最后一个If语句覆盖了所有剩余的可能性,只需将最后一个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);
        }else
            return 0;
    
    }
    
    private static int editDistance(字符串s1、字符串s2){
    if((s2.isEmpty()&&(dn==0&&dc==0&&di==0))| |(s1.isEmpty()&&(dn==0&&dc==0&&di==0)))
    返回整数.max(s1.length(),s2.length());
    if(s2.isEmpty()){
    返回0;
    }else if(s1.isEmpty()){
    dc++;
    返回1+editDistance(s1,rest(s2));
    }如果(s1.字符(0)=s2.字符(0)){
    dn++;
    返回距离(休息(s1),休息(s2));
    }如果(s1.字符(0)!=s2.字符(0)&&dc di){
    di++;
    返回1+editDistance(剩余(s1),s2);
    }否则
    返回0;
    }
    
  • 如果最后一个If语句涵盖了所有剩余的可能性,只需将最后一个If语句替换为