递归 - 反转字符串

时间:2014-02-27 22:06:37

标签: java string recursion

我相信我对递归(阶乘等)有一个很好的理解,但是在下面的例子中,在反转字符串时我不理解这一行。有人可以解释它的作用吗?

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

方法的完整代码:

public static String reverseString(String str){

            if(str.length()<2){
                System.out.println("reached Base case");
                return str;
            }

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


            }

6 个答案:

答案 0 :(得分:2)

调用substring(1)从字符串中取出第一个字符。这被送入递归调用,它会反转除最后一个字符之外的所有字符。然后,附加第一个字符,完成逆转。

示例:

reverseString("abc") =>
reverseString("bc") + 'a' =>
(reverseString("c") + 'b') + 'a' =>
("c" + 'b') + 'a' =>
"cb" + 'a' =>
"cba"

答案 1 :(得分:0)

它接受第一个字符后的所有内容并调用递归函数。第一个字符放在字符串的末尾。这会导致逆转。

return reverse(Everything after the first) + the first

答案 2 :(得分:0)

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

例如,字符串为HelloWorld 然后"HelloWorld".substring(1)返回"elloWorld""HelloWorld".charAt(0)返回"H"

你取第一个字母并将其添加到字符串的末尾。但在此之前,你要先用第一部分再做一遍。最后,这个算法会反转字符串。

答案 3 :(得分:0)

我们取这个字符串:

str = "Reverse";

str.substring(1)的值是“正面”。 str.charAt(0)的值为“R”。

如果您了解递归,我认为您可以从中获取它。

答案 4 :(得分:0)

通过将每个连续的子串放在堆栈上直到它达到小于2的长度,它无效地反转字符串;然后通过从堆栈中弹出这些结果并将第一个字符附加到子字符串来反转字符。这是低效的,因为Java包含StringBuilder类,并且具有reverse方法。

答案 5 :(得分:0)

尝试考虑以这种方式反转字符串:

//reverse of a string can be expressed as the last character 
//plus the reverse of everything remaining. For example, if we had
//"food", you would have "d" + reverse("foo"), which is "d" + "oof"
//which gives you "doof". So:

reverse(str)    = str[str.length - 1] + reverse(str[0:str.length - 2]);
reverse(str[0]) = str[0] //reverse of a 1 character string is the character itself

因此将此应用于字符串abcd

你有:

reverse("abcd") = "d" + reverse("abc")
reverse("abc")  = "c" + reverse("ab")
reverse("ab")   = "b" + reverse("a")
reverse("a")    = "a";

现在当你替换时,你有:

reverse("ab")   = "b" + "a" = "ba"
reverse("abc")  = "c" + "ba" = "cba"
reverse("abcd") = "d" + "cba" = "dcba"

考虑如何编写模仿此行为的代码。