我现在正在学习如何使用递归,而且我很难理解以下代码是如何工作的:
public static String reverseString(String str)
{
if (str.length() == 0)
return str;
else
return reverseString(str.substring(1)) + str.charAt(0);
}
我的程序的目标是编写一个递归方法,它接受String作为参数并返回该String的反向形式。我也知道这段代码可行。
我对它为何如此有效感到困惑。我希望有人了解递归并知道如何解释它!我理解子串是如何工作的以及该方法如何将第一个字母与单词分开(例如Mike ---> ike + M)。
我不明白的是基本案例是如何达到零的,以及该方法如何以相反的顺序返回字符串而不是无限地进行。
任何帮助将不胜感激!
答案 0 :(得分:5)
每次使用较短的字符串调用方法时:第一个字符将被删除并随后附加。
调用将按如下方式进行(例如"Mike"
):
reverseString("Mike")
reverseString("ike") + 'M'
(reverseString("ke") + 'i') + 'M'
((reverseString("e") + 'k') + 'i') + 'M'
(((reverseString("") + 'e') + 'k') + 'i') + 'M'
((("" + 'e') + 'k') + 'i') + 'M' // base case is reduced: length is zero, therefore reverseString returns ""
(("e" + 'k') + 'i') + 'M'
("ek" + 'i') + 'M'
"eki" + 'M'
"ekiM"
在第一次迭代中,字符串的长度为4.每次执行reverseString
时,长度会减少,因此在完成一定数量的调用后它将完成。
答案 1 :(得分:0)
让我们逐行评估:
1. reverseString(str.substring(1)) + str.charAt(0) // ______ + M
2. reverseString(str.substring(1)) + str.charAt(0) // ______ + i + M
3. reverseString(str.substring(1)) + str.charAt(0) // ______ + k + i + M
4. reverseString(str.substring(1)) + str.charAt(0) // e + k + i + M
答案 2 :(得分:0)
str.substring(1)将返回原始的子字符串,从第一个索引开始到字符串结尾。所以,例如:
"test".substring(1).equals("est") == true
因此,对于每个递归调用,传递的字符串将缩短一次,最终满足0长度字符串的终止条件。
你所展示的代码基本上只是将给定字符串的第一个字符附加到字符串其余部分的末尾(第二个字符为最后一个)。
对于递归问题,请尝试使用显式参数值写出调用堆栈。一旦你进入堆栈的最终调用,你将达到终止条件,返回的结果将“冒泡”回调用堆栈。