使用递归来反转字符串的方法

时间:2012-10-14 23:49:11

标签: java recursion

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;
    }
}

有人可以详细解释我这个方法的工作原理

5 个答案:

答案 0 :(得分: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")只是"c" - 所以reverseString("bc")"cb",上面的意思是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" 

答案 1 :(得分:4)

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

char c = s.charAt(0);

返回reverseString(s.substring(1))+ c;

1)对于H

c ='H'

返回reverseString(“ELLO”)+ H

2)对于E

c = 'E'

return reverseString("LLO") + E

3)对于E

c ='E'

返回reverseString(“LLO”)+ E

4)对于L

c ='L'

返回reverseString(“LO”)+ L

5)对于L

c ='L'

返回reverseString(“O”)+ L

6)因为,子串s <= 1

return S = 'O'

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

所以,O + L + L + E + H =“OLLEH”

BTW,在java中,字符串反转是使用StringBuilder / StringBuffer的cakewalk。 例如StringBuffer的( “你好” .toReverse())的toString();

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

对于并发复杂的应用程序,请使用StringBuffer,即Synchrinized。

希望,这有帮助。

答案 2 :(得分:2)

这很简单。

如果使用一个char字符串调用方法,则返回相同的字符串并停止。否则,它将删除要追加到最后一个字符的第一个字符,并使用其余字符调用相同的方法。

His

为例

这样就可以了。

  1. 由于字符串长度为3(> 1),因此需要将H附加到最后一个并使用is调用reverse方法。
  2. 由于现在字符串长度为2(> 1),因此需要i追加到最后一个,并使用s调用reverse方法。
  3. 现在字符串长度为1,因此它将返回s并且递归将停止。
  4. 最后,它将开始以 LAST-IN-FIRST-OUT 方式附加你的角色,例如    S +我+ H
  5. 这样它会将最终输出作为siH返回。
  6. 其他解释方式:

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

    希望这有帮助。

答案 3 :(得分:2)

在那里放一些print语句,看看用什么参数调用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。唯一的例外是反转一个单字母的字符串,它只返回一个字母的字符串本身。

答案 4 :(得分:0)

有趣的功能我几年没有做过java,但这就是它的工作方式。

检查以确保我们正在倒车的是多个角色,如果它不是返回它。 现在我们做的是我们取第一个字符并将其移动到字符串的末尾,然后我们返回其前面的其余字符串。

我最后结束了你的versering成为一个字符的字符串,第一个如果clausse告诫要返回的完整字符串。 :)

现在我确信有更好的方法可以解决这个问题。我确信java有一个反向字符串函数,如果你因为某些原因必须自己做这样的事情。它也许不起作用我从记忆中做到这一点,我的java生锈了

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

    }
    return s2;`