2

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

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

}
4

3 回答 3

1

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

于 2013-10-20T06:45:11.380 回答
1

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

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

于 2013-10-20T06:47:27.360 回答
1

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

使用尾调用数据流进行反转

图片的矢量来源

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

于 2013-10-20T07:01:29.587 回答