在 Java 中需要有关字符串递归的帮助
Require assistance with String recursion in Java
我现在正在学习如何使用递归,但我在理解以下代码的工作原理时遇到了一些困难:
public static String reverseString(String str)
{
if (str.length() == 0)
return str;
else
return reverseString(str.substring(1)) + str.charAt(0);
}
我的程序的目标是编写一个递归方法,它将接受一个字符串作为参数,return 该字符串的反向形式。我也知道这段代码确实有效。
我对它的工作原理有点困惑。我希望有人了解递归并知道如何解释它!我了解子字符串的工作原理以及该方法如何将第一个字母与单词分开(例如 Mike ---> ike + M)。
我不明白的是基本情况如何达到零以及方法如何 return 以相反的顺序而不是无限地通过字符串。
如有任何帮助,我们将不胜感激!
每次使用较短的字符串调用该方法时:删除第一个字符并在后面追加。
通话将按如下方式进行(以您为例 "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. 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
str.substring(1) 将 return 原始的子字符串,从第一个索引开始到字符串的末尾。所以,例如:
"test".substring(1).equals("est") == true
因此对于每次递归调用,传递的字符串都会缩短一个字符,最终满足0长度字符串的终止条件。
您显示的代码基本上只是将给定字符串的第一个字符附加到字符串其余部分的末尾(倒数第二个字符)。
对于递归问题,尝试用显式参数值写出调用堆栈。一旦到达堆栈的最终调用,您将达到终止条件并且 returned 结果将 "bubble" 备份调用堆栈。
我现在正在学习如何使用递归,但我在理解以下代码的工作原理时遇到了一些困难:
public static String reverseString(String str)
{
if (str.length() == 0)
return str;
else
return reverseString(str.substring(1)) + str.charAt(0);
}
我的程序的目标是编写一个递归方法,它将接受一个字符串作为参数,return 该字符串的反向形式。我也知道这段代码确实有效。
我对它的工作原理有点困惑。我希望有人了解递归并知道如何解释它!我了解子字符串的工作原理以及该方法如何将第一个字母与单词分开(例如 Mike ---> ike + M)。
我不明白的是基本情况如何达到零以及方法如何 return 以相反的顺序而不是无限地通过字符串。
如有任何帮助,我们将不胜感激!
每次使用较短的字符串调用该方法时:删除第一个字符并在后面追加。
通话将按如下方式进行(以您为例 "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. 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
str.substring(1) 将 return 原始的子字符串,从第一个索引开始到字符串的末尾。所以,例如:
"test".substring(1).equals("est") == true
因此对于每次递归调用,传递的字符串都会缩短一个字符,最终满足0长度字符串的终止条件。
您显示的代码基本上只是将给定字符串的第一个字符附加到字符串其余部分的末尾(倒数第二个字符)。
对于递归问题,尝试用显式参数值写出调用堆栈。一旦到达堆栈的最终调用,您将达到终止条件并且 returned 结果将 "bubble" 备份调用堆栈。