我正在尝试学习Java,现在我正在尝试算法。所以,我被递归卡住了。我有一个代码我不懂。
public static String reverseString(String text){
// base case
if (text.length() == 0) {
return text;
}
else {
// recursive call
return reverseString(text.substring(1)) + text.charAt(0);
}
}
public static void main(String[] args) {
String str = new String("howdy");
// calling recursive function
String reverse = reverseString(str);
System.out.println(reverse); // Prints: ydwoh
}
问题是,对我来说递归调用在这个代码中对我来说是:
它第一次重新运行owdyh,
第二次wdyo等等。
我不明白字符串ydwoh是如何产生的。我怀疑某个地方按照正确的顺序进行了协调,并存储在某个地方,但我也不知道这个地方在哪里。
更新
我用纸试了一下,得到的是:
第一个递归调用:
返回值owdyh=";owdy"+"h〃;
第二次呼叫:
返回值wdyo=";wdy"+"o";
等等
困难在于在调用后处理。第一个字母被添加到其余的reverseString
的结果的末尾
reverseString "howdy"
reverseString "owdy"
reverseString "wdy"
reverseString "dy"
reverseString "y"
reverseString ""
return ""
return "" + "y"
returns "y" + "d"
returns "yd" + "w"
returns "ydw" + "o"
returns "ydwo" + "h"
returns "ydwoh"
这就像是一个归纳的数学证明:
- 空字符串被反转(结果为空字符串(
- 当递归调用在较小的字符串上工作时,将第一个字符放在末尾,也会反转字符串
- 所以
reverseString
适用于所有长度的字符串
感谢您的回答!他们帮我弄清楚了我的误解!我无法理解的是text.charAt(0)
中的所有字符都存储在哪里!诀窍是,它们存储在堆栈中,没有任何链接。这是LIFO(后进先出(的工作方法。