为什么顺序对于这种递归方法很重要?

Why does the order matter for this recursion method?

以下代码是对编码 bat 的问题的回应:http://codingbat.com/prob/p101372

这个解决方案有效...

public String changeXY(String str) {

if (str=="") {return "";}
else if (str.substring(0,1).equals("x") && str.length()<2) { return "y";}
else if (str.substring(0,1)!="x" && str.length()<2) {return str;}
else if (str.substring(0,1).equals("x") && str.length()>1) {return "y" +    changeXY(str.substring(1));}
else if (str.substring(0,1)!=("x")) { return str.substring(0,1) + changeXY(str.substring(1));}


return changeXY(str);

}

但是,如果我只是重新排列 if 语句,为什么解决方案不起作用? 当然,顺序无关紧要。有人可以解释为什么订单在这种情况下/在任何情况下都很重要。

很可能是因为您正在将字符串与 !=== 进行比较(对于第一种情况)。这应该可以按任何顺序完成。

public String changeXY(String str) {
    if (str.isEmpty()) return "";
    else if (str.substring(0,1).equals("x") && str.length()<2) return "y";
    else if (!str.substring(0,1).equals("x") && str.length()<2) return str;
    else if (str.substring(0,1).equals("x") && str.length()>1) return "y" + changeXY(str.substring(1));
    else if (!str.substring(0,1).equals("x")) return str.substring(0,1) + changeXY(str.substring(1));

    return changeXY(str);
}

但是,"smarter" 代码将是:

public String changeXY(String str) {
    if (str.isEmpty() || (str.charAt(0) != 'x' && str.length() < 2)) return str;
    else if (str.charAt(0) == 'x') return "y" +    changeXY(str.substring(1));
    return str.charAt(0) + changeXY(str.substring(1));
}

在最后一种情况下,顺序也很重要,因为其他测试之后的测试会考虑到如果我们到达这里它们就会失败。