反转字符串的调用堆栈使用递归

时间:2018-11-19 04:43:09

标签: java recursion

我很难理解使用以下代码反转字符串的调用堆栈:

public static String reverseString(String str) {
        String reverse = "";
        if (str.length() == 1) {

            return str; 
        } else {
            reverse += str.charAt(str.length() - 1) + reverseString(str.substring(0, str.length() - 1));
            return reverse;
        }
    }

您可以看到堆栈从1堆积到4,然后从4堆积到1。 以str =“ abcd”为例。它应该首先返回“ a”(因为首先从调用堆栈弹出“ a”),这不会反转字符串。我在这里弄错了吗?谢谢!

enter image description here

2 个答案:

答案 0 :(得分:1)

仔细考虑代码中的以下代码段:

else {
        reverse += str.charAt(str.length() - 1) + reverseString(str.substring(0, str.length() - 1));
        return reverse;
    }

调用堆栈正在递归使用最后一个字符被排除的函数,并将被排除的字符附加到变量reverse。 您所缺乏的是,首先,调用堆栈将返回最后一个排除的字符(d),而不是您提到的“ a”,并将其附加到字符串“ reverse”。

手动重复代码:
反向输入// reverseString(输入)
1. d abcd
2. c abc
3. b ab
4. a // a返回长度为1的if块

您会看到反向字符串随每个调用而建立。

答案 1 :(得分:1)

您的程序运行正常,但是您无法跟踪程序。我在下面显示了程序中所有递归调用的堆栈框架(向上堆栈和向下堆栈)。 stacktraceimage