在Java中使用递归反转字符串

Bob*_*ers 47 java string recursion reverse

这是一些递归反转字符串的Java代码.

有人可以解释它是如何工作的吗?

public static String reverse(String str) {
    if ((null == str) || (str.length() <= 1)) {
        return str;
    }
    return reverse(str.substring(1)) + str.charAt(0);
}
Run Code Online (Sandbox Code Playgroud)

我不明白这是如何工作的.

Dav*_*ebb 93

该函数接受一个字符串的第一个字符str.charAt(0)- 将它放在最后,然后调用自身reverse()- 在余数上 - str.substring(1)将这两个东西加在一起得到它的结果 -reverse(str.substring(1)) + str.charAt(0)

当传入的String是一个或更少的字符,因此没有剩余的余数 - 当str.length() <= 1)- 它停止递归调用自己并且只返回传入的字符串.

所以它运行如下:

reverse("Hello")
(reverse("ello")) + "H"
((reverse("llo")) + "e") + "H"
(((reverse("lo")) + "l") + "e") + "H"
((((reverse("o")) + "l") + "l") + "e") + "H"
(((("o") + "l") + "l") + "e") + "H"
"olleH"
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 20

你需要记住,你不会只有一个电话 - 你将有嵌套的电话.因此,当"最高度嵌套"的调用立即返回时(当它只找到"o"时),下一级别将会采取str.charAt(0)- str在该点处"lo".这将返回"ol".

然后,下一个水平将收到"OL",执行str.charAt(0)用于的值str(这是"LLO"),返回"OLL"下一级进行.

那么下一个水平将收到"OLL"从它的递归调用,执行str.charAt(0)的价值str(这是"ELLO"),返回"欧莱"到一个新的水平了.

然后最后一级将收到"OLL"从它的递归调用,执行str.charAt(0)的价值str(这是"你好"),返回"2009东海生日贺"到原来的调用者.

你可以考虑堆栈是有意义的:

// Most deeply nested call first...
reverse("o") -> returns "o"
reverse("lo") -> adds 'l', returns "ol" 
reverse("llo") -> adds 'l', returns "oll" 
reverse("ello") -> adds 'e', returns "olle" 
reverse("hello") -> adds 'h', returns "olleh" 
Run Code Online (Sandbox Code Playgroud)