2
public static void main(String args[]) {
    System.out.println(reverseString("His"));
}

public static String reverseString(String s) {
    if (s.length() <= 1) {
        return s;
    } else {
        char c = s.charAt(0);
        return reverseString(s.substring(1)) + c;
    }
}

有人可以详细解释一下这种方法的工作原理吗

4

5 回答 5

5

我认为了解这些类型的方法如何工作的最佳方法是通过一个简单的示例手动完成它们。让我们拿字符串来"abc"考虑当我们调用时会发生什么

reverseString("abc")

在第一次迭代中,我们考虑else块(因为"abc".length()不小于或等于 1)。方法返回

reverseString("abc".substring(1)) + "abc".charAt(0)

这相当于

reverseString("bc") + 'a'

现在我们必须考虑reverseString("bc")。再次,我们发现自己在else块中,该方法将返回

reverseString("bc".substring(1)) + "bc".charAt(0)

这相当于

reverseString("c") + 'b'

显然,正如预期的那样, reverseString("c")is just "c"- so reverseString("bc")is "cb"which 是指这reverseString("abc")就是"cb" + 'a'给我们的。"cba"


总而言之,我们基本上是在做这样的事情:

reverse("abc")
reverse("bc") + 'a'
reverse("c") + 'b' + 'a'
"cba" 

使用 4 个字符的字符串:

reverse("abcd")
reverse("bcd") + 'a'
reverse("cd") + 'b' + 'a'
reverse("d") + 'c' + 'b' + 'a'
"dcba" 
于 2012-10-14T23:59:32.323 回答
4

假设您有一个字符串“Hello”,那么它将从左到右对字符串执行递归。

字符 c = s.charAt(0);

返回反向字符串(s.substring(1))+ c;

1) 对于 H

c = 'H'

返回反向字符串(“ELLO”)+ H

2) 对于 E

c = 'E'

return reverseString("LLO") + E

3) 对于 E

c = 'E'

返回反向字符串(“LLO”)+ E

4) 对于 L

c = 'L'

返回反向字符串(“LO”)+ L

5) 对于 L

c = 'L'

返回反向字符串(“O”)+ L

6) 因为,子串 s<= 1

return S = 'O'

7) 现在它将从下到上恢复递归函数,并将连接每个级别的所有字符串 s

所以,O + L + L + E + H = "OLLEH"

顺便说一句,在 java 中,字符串反转是使用 StringBuilder/StringBuffer 的小菜一碟。例如 StringBuffer("Hello".toReverse()).toString();

如果您使用的是单线程和更简单的应用程序,请使用 StringBuilder

因为,并发的复杂应用程序使用 StringBuffer,它的 Synchrinized。

希望能帮助到你。

于 2012-10-15T00:26:18.060 回答
2

这很简单。

如果使用一个 char 字符串调用您的方法,它会返回相同的字符串并停止。否则,它会删除最后一个附加的第一个字符,并使用剩余的字符调用相同的方法。

举个例子His

这将像这样工作。

  1. 由于字符串长度为 3 (>1),因此将其H取出以追加到最后并调用 reverse 方法is
  2. 由于现在字符串长度为 2 (>1),因此将其i取出以追加到最后并调用 reverse 方法s
  3. 现在字符串长度是1这样,它将返回s并且递归将停止。
  4. 最后,它将开始以LAST-IN-FIRST-OUT的方式添加您的角色,例如 s+i+H
  5. 这样,它会将最终输出返回为siH.

其他解释方式:

   reverse("His" ) ->  reverse("is" )+H -> ( reverse("s" )+i)+H -> (s+i)+H ->siH

希望这可以帮助。

于 2012-10-14T23:57:44.930 回答
2

在其中放置一些打印语句,以查看何时reverseString使用哪些参数调用该方法。这就是你会得到的:

his
is
s

所以每次函数递归时,它都会用s.substring(1). 然后它将截断的第一个字符添加到反转该子字符串的结果的末尾。使用相同的上述三个调用,这看起来像:

reverse(is) + h
reverse(s) + i
s

请注意,最后一种情况只返回单个字母“s”。这称为递归的基本情况,每个递归函数都需要一个返回结果。

如果您将结果替换reverse(x)为上述三个调用,您会得到:

si + h
s + i
s

这就是它的工作原理。要反转字符串,请反转字母 [1-n],然后在其末尾添加字母 0。唯一的例外是反转一个单字母字符串,它只返回该单字母字符串本身。

于 2012-10-14T23:58:37.380 回答
0

有趣的功能我已经有几年没有做过 java 了,但这应该是它的工作原理。

检查以确保我们正在反转的内容不止一个字符,如果不是返回它。现在我们要做的是我们将第一个字符移动到字符串的末尾,然后我们将字符串的其余部分返回到它前面。

最后,我将您的 versing 字符串作为一个字符,并且第一个 if clausse 导致完整的字符串被返回。:)

现在我确信有更好的方法来解决这个功能。如果你出于某种原因必须自己做这样的事情,我相信java有一个反向字符串函数。它也可能行不通我是从记忆中做的,我的 java 生锈了

`public static  String reverseString(String s){
    for(int x=s.length(); x>=0; x--) {
      s2 .= s.charAt(x);

    }
    return s2;`
于 2012-10-15T00:01:24.690 回答