需要Java中字符串递归的帮助

需要Java中字符串递归的帮助,java,string,recursion,methods,substring,Java,String,Recursion,Methods,Substring,我现在正在学习如何使用递归,但在理解以下代码的具体工作方式时遇到了一些困难: public static String reverseString(String str) { if (str.length() == 0) return str; else return reverseString(str.substring(1)) + str.charAt(0); } 我的程序的目标是编写

我现在正在学习如何使用递归,但在理解以下代码的具体工作方式时遇到了一些困难:

    public static String reverseString(String str)
    {
        if (str.length() == 0)
             return str;
        else
            return reverseString(str.substring(1)) + str.charAt(0);
    }
我的程序的目标是编写一个递归方法,它将接受一个字符串作为参数,并返回该字符串的相反形式。我也知道这个代码确实有效

我只是有点搞不懂它为什么会起作用。我希望有人能理解递归并知道如何解释它!我了解子字符串是如何工作的,以及该方法是如何将第一个字母从单词中分离出来的(例如Mike-->ike+M)

我不理解的是基本情况如何达到零,以及该方法如何以相反的顺序返回字符串,而不是无限次地返回


任何帮助都将不胜感激

每次使用较短的字符串调用方法时:删除第一个字符,然后追加

呼叫将按如下方式进行(例如
“Mike”
):


在第一次迭代中,字符串的长度为4。每次执行
reverseString
时,长度都会减少,因此在一定数量的调用之后,它将结束。

让我们逐行评估:

1. reverseString(str.substring(1)) + str.charAt(0) // ______ + M
2. reverseString(str.substring(1)) + str.charAt(0) // ______ + i + M
3. reverseString(str.substring(1)) + str.charAt(0) // ______ + k + i + M
4. reverseString(str.substring(1)) + str.charAt(0) //      e + k + i + M 
str.substring(1)将返回原始的子字符串,从第一个索引开始,一直到字符串的末尾。例如:

"test".substring(1).equals("est") == true
因此,对于每个递归调用,传递的字符串将短一个字符,最终满足长度为0的字符串的终止条件

您所展示的代码基本上只是将给定字符串的第一个字符追加到字符串其余部分的末尾(倒数第二个字符)


对于递归问题,请尝试使用显式参数值写出调用堆栈。一旦到达堆栈的最终调用,您将点击终止条件,返回的结果将“冒泡”备份调用堆栈。

添加日志并使用set by step debugger查看函数的输入和输出尝试单步执行。每次递归调用的输入会发生什么变化?作为旁注,
if(str.length()==0)
可以是
if(str.length()==1)
"test".substring(1).equals("est") == true