语义上理解递归反向字符串返回语句

时间:2011-08-28 00:16:35

标签: java recursion

目前我熟悉递归并试图进一步理解我想在反转字符串的背景下看一下。我知道它不如使用StringBuffer那样有效,但我说这主要是为了帮助我更好地理解。我知道有关于此问题的一些问题,但我想对演练提供一些帮助。

                 return reverse(str.substring(1)) + str.charAt(0);

此场景中的字符串=“开始”

我知道substring方法是在没有第一个字符

的情况下获取子字符串

递归调用。 (部分)

reverse("Start")
reverse("tart")
reverse("art")
reverse("rt")
reverse("t") // when string is 1 char length then the reverse string is returned

但我想了解它如何在递归演练中连接和重建字符串。

提前致谢。

2 个答案:

答案 0 :(得分:5)

声明

return reverse(str.substring(1)) + str.charAt(0);

说“反转最后的n-1个字符并将第一个字符移到结尾”(字符串的长度为n)。如果您考虑通过以下方式跟踪递归调用,这是有道理的:

reverse("tart") + "S"
(reverse("art") + "t") + "S"
((reverse("rt") + "a") + "t") + "S"
(((reverse("t") + "r") + "a") + "t") + "S"
((((reverse("") + "t") + "r") + "a") + "t") + "S"

当你留下一个空字符串时,假设一个合适的停止条件,方法调用现在逐个返回:

(((("t") + "r") + "a") + "t") + "S"
((("tr") + "a") + "t") + "S"
(("tra") + "t") + "S"
("trat") + "S"
"tratS"

答案 1 :(得分:0)

对于递归,最好考虑具有基本情况和递归调用。

我认为你有类似的东西:

public String reverse(String str){
    if (str.length() == 0) 
         return str;

    return reverse(str.substring(1)) + str.charAt(0);
}

最后的返回调用只是从字符串中取出第一个字符并将其连接到reverse的递归调用。因此,逐渐变短的字符串的第一个字符总是被附加到字符串的末尾,即反转。

而不是考虑递归的每个阶段,最好只看基本情况和递归调用。使用归纳过程,您可以确定递归是有效的。

实际上我认为在这种情况下,从一个包含3个字符的字符串开始会更容易,例如“str”以查看最新情况。如果它适用于它,它将适用于所有情况(这是归纳法)。