这种递归是如何工作的

时间:2013-10-20 06:40:06

标签: java recursion

这段代码反转传递给它的字符串参数。我知道字符串是不可变的。我似乎不明白发生了什么。它在哪里存储它返回的反向字符串。

public static String reverseRecursively(String str) {

    //base case to handle one char string and empty string
    if (str.length() < 2) {
        return str;
    }

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

}

3 个答案:

答案 0 :(得分:1)

您的reverseRecursively(str.substring(1)) + str.charAt(0)每次调用时都会创建一个新的String对象。

答案 1 :(得分:1)

  

它在哪里存储它返回的反向字符串。

正如方法所示,它以递归方式调用自身。每次调用它都会向调用堆栈添加条目。因此,如果您关注存储这些“中间”结果的魔力,请阅读调用堆栈的工作原理。

答案 2 :(得分:1)

这是一个说明数据流的调用图:

Reverse with a tail call dataflow

Vector source of the image

每次调用都返回一个字符串副本,其中第一个字符放在最后一个字符,其余字符由进一步调用处理对这些字符串的引用存储在堆栈中,随着每次调用而增长(需要更多的堆栈空间来处理更长的字符串)。