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语句替换为