为什么这段代码有效?
public static String reverse(String a) {
if(a.length() == 0) {
return a;
} else {
return reverse(a.substring(1)) + a.charAt(0);
}
}
这不是吗?
public static String reverse(String a) {
if(a.length() == 0) {
return a;
} else {
return reverse(a.substring(1)) + a.substring(0);
}
}
此外,递归如何在案例1中起作用,添加a.charAt(0)
的作用是什么?这种方法如何达到基本情况?
答案 0 :(得分:5)
因为a.charAt(0)
会返回第一个字符,而a.substring(0)
会返回整个String
(来自索引0
)。变化
return reverse(a.substring(1)) + a.substring(0);
类似
return reverse(a.substring(1)) + a.substring(0, 1);
它将按预期工作。
答案 1 :(得分:1)
为了更好地理解递归代码,您可以尝试为每个方法调用打印状态,例如
public static String reverse(String a) {
System.out.println("Calling reverse(\"" + a + "\")");
if(a.length() == 0) {
System.out.println("Base case encountered for string : \"" + a + "\"");
return a;
} else {
String b = reverse(a.substring(1));
String c = a.charAt(0);
System.out.println(reverse(\"" + a + "\") returning \"" + b + "\" + \"" + c + "\"");
return b + c;
}
}
当您尝试拨打reverse("xyz")
时,您会在标准输出中看到以下文字:
Calling reverse("xyz")
Calling reverse("yz")
Calling reverse("z")
Calling reverse("")
Base case encountered for string : ""
reverse("z") returning "" + "z" = "z"
reverse("yz") returning "z" + "y" = "zy"
reverse("xyz") returning "zy" + "x" = "zyx"
我们可以看到几件事:
b
和c
。然后返回reverse(b) + c
。答案 2 :(得分:0)
首先,' a.substring()'返回从作为参数给出的索引开始的子字符串,因此在使用' a.substring(1)'作为递归方法的参数,第一个字符总是被跳过,并且作为参数给出的字符串的长度逐渐减小。一旦没有角色,它就会到达基本情况。
其次,' a.charAt()'返回作为参数给出的字符串的索引处存在的字符。所以' a.charAt(0)'返回字符串的第一个索引' a'它作为递归方法的参数给出。
最后,第一个代码可以工作,因为每次它发送除第一个字符之外的整个字符串,并且它包含返回的字符串末尾的第一个字符。所以最后,整个字符串都被反转了。 另一方面,第二个代码包括从字符串的第一个索引开始的整个子字符串,而不是第一个字符。
要使代码有效,您可以使用' charAt(0)'像第一个代码 -
return reverse(a.substring(1)) + a.charAt(0);
或者您可以使用' a.substring(0,1)'它只考虑第一个字符作为子字符串并返回它 -
return reverse(a.substring(1)) + a.substring(0, 1);