Java 遍历递归代码以反转用户输入的字符串

Java 遍历递归代码以反转用户输入的字符串,java,string,eclipse,recursion,Java,String,Eclipse,Recursion,所以我在春假期间为自己写了一些递归代码,没有任何目的。目前,我正在尝试创建一个递归函数,该函数将从用户处反转输入的字符串。我现在有了这个,而且它很有效 import java.util.Scanner; public class Recursion { public static void main(String args[]) { String userStr = " ", userAlt = " "; int position = 0, lengt

所以我在春假期间为自己写了一些递归代码,没有任何目的。目前,我正在尝试创建一个递归函数,该函数将从用户处反转输入的字符串。我现在有了这个,而且它很有效

import java.util.Scanner;

public class Recursion {

    public static void main(String args[]) {
        String userStr = " ", userAlt = " ";
        int position = 0, length = userStr.length() - 1;
        @SuppressWarnings("resource")
        Scanner scan = new Scanner(System.in);

        System.out.println("Please enter a string.");
        userStr = scan.nextLine();

        userAlt = reverse(userStr);
        System.out.println("\n" + userStr + " is... \n" + userAlt + " backwards!");

    }

    public static String reverse(String userStr) {
        if(userStr.isEmpty()) {
            return userStr;
        }
        else {
            return reverse(userStr.substring(1)) + userStr.charAt(0);
        }
    }
}

尽管如此,我不确定这个返回语句是如何工作的,因为它让我感到困惑。我认为常量输出只是字符串末尾的第一个字母,没有完全反转,但事后看来它是正确的。我希望有人能帮助我,我不认为我遗漏了substring()方法的任何内容。提前谢谢

例如:如果输入的字符串是“spring”,那么userAlt的输出应该是“gnirps”。但是为什么呢


编辑:对int position&length的无用代码声明表示抱歉,我正在研究另一种方法来解决它,遇到这种方法,然后从未删除代码。

下面的
return
语句中有两个部分:

return reverse(userStr.substring(1)) + userStr.charAt(0)
第二部分,
userStr.charAt(0)
是收集到最终结果中的部分

第一部分,
reverse(userStr.substring(1))
是使用一个新参数递归调用函数,该参数是
userStr.substring(1)
。这一部分只是为了保持函数被调用,直到参数中没有其他字符为止,或者换句话说,保持函数运行,直到所有字符被收集到最终结果中为止

当您考虑递归调用时,请考虑堆栈(后进先出)。从这个意义上说,由于
O
将是最后一个推送到堆栈中的字符,因此它将是第一个被输出的字符

理解递归方法如何工作的最简单方法是跟踪

运行示例:

Please enter a string.
hello
userStr when userStr is not empty: hello
userStr.substring(1) when userStr is not empty: ello
userStr.charAt(0) when userStr is not empty: h
userStr when userStr is not empty: ello
userStr.substring(1) when userStr is not empty: llo
userStr.charAt(0) when userStr is not empty: e
userStr when userStr is not empty: llo
userStr.substring(1) when userStr is not empty: lo
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: lo
userStr.substring(1) when userStr is not empty: o
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: o
userStr.substring(1) when userStr is not empty: 
userStr.charAt(0) when userStr is not empty: o
userStr when it userStr is empty: 

hello is... 
olleh backwards!

现在您可以看到
'o'+'l'+'l'+'e'+'h'=“olleh”
是如何形成的。

以下
return
语句中有两个部分:

return reverse(userStr.substring(1)) + userStr.charAt(0)
第二部分,
userStr.charAt(0)
是收集到最终结果中的部分

第一部分,
reverse(userStr.substring(1))
是使用一个新参数递归调用函数,该参数是
userStr.substring(1)
。这一部分只是为了保持函数被调用,直到参数中没有其他字符为止,或者换句话说,保持函数运行,直到所有字符被收集到最终结果中为止

当您考虑递归调用时,请考虑堆栈(后进先出)。从这个意义上说,由于
O
将是最后一个推送到堆栈中的字符,因此它将是第一个被输出的字符

理解递归方法如何工作的最简单方法是跟踪

运行示例:

Please enter a string.
hello
userStr when userStr is not empty: hello
userStr.substring(1) when userStr is not empty: ello
userStr.charAt(0) when userStr is not empty: h
userStr when userStr is not empty: ello
userStr.substring(1) when userStr is not empty: llo
userStr.charAt(0) when userStr is not empty: e
userStr when userStr is not empty: llo
userStr.substring(1) when userStr is not empty: lo
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: lo
userStr.substring(1) when userStr is not empty: o
userStr.charAt(0) when userStr is not empty: l
userStr when userStr is not empty: o
userStr.substring(1) when userStr is not empty: 
userStr.charAt(0) when userStr is not empty: o
userStr when it userStr is empty: 

hello is... 
olleh backwards!

现在,您可以看到如何形成
'o'+'l'+'l'+'e'+'h'=“olleh”

那么,将userStr中除第一个字符外的所有字符重新串接,将该字符(0)(字符串中的最后一个字符向后打印)返回到userAlt中,然后每次递归调用都会将userAlt中的前一个字符上移?还是我没有正确地理解?我已经更新了我的答案,并做了更多的解释。我希望,这会有帮助。如果有任何疑问/问题,请随时发表评论。哦,好吧,所以我对返回语句中我自己的编码感到困惑。因此,传递的字符是userStr的第一个字符,在本例中为“H”,然后将其放入userAlt中,并通过递归调用将其向后推送一个索引(0到1…1到2…等等)?我认为这是因为字符串是字符数组,所以我不确定添加字符(0)是在userAlt的第0个元素添加它,还是从userStr中获取第0个元素。提前感谢您的帮助!递归把我搞糊涂了。我当然会的!奇怪的是,这就是字符串和字符在幕后的工作方式,对吗?可能你错过了我回答的以下部分:当你想到递归调用时,想想堆栈(后进先出)。从这个意义上说,由于
o
将是最后一个推送到堆栈中的字符,因此它将是第一个被输出的字符。。我希望,现在应该清楚了。如果有任何进一步的疑问/问题,请随时发表评论。那么,将userStr中除第一个字符外的所有字符串接起来,将该字符(0)(字符串中的最后一个字符向后打印)返回到userAlt中,然后在每次递归调用时,将userAlt中的前一个字符上移,这是否有意义?还是我没有正确地理解?我已经更新了我的答案,并做了更多的解释。我希望,这会有帮助。如果有任何疑问/问题,请随时发表评论。哦,好吧,所以我对返回语句中我自己的编码感到困惑。因此,传递的字符是userStr的第一个字符,在本例中为“H”,然后将其放入userAlt中,并通过递归调用将其向后推送一个索引(0到1…1到2…等等)?我认为这是因为字符串是字符数组,所以我不确定添加字符(0)是在userAlt的第0个元素添加它,还是从userStr中获取第0个元素。提前感谢您的帮助!递归把我搞糊涂了。我当然会的!奇怪的是,这就是字符串和字符在幕后的工作方式,对吗?可能你错过了我回答的以下部分:当你想到递归调用时,想想堆栈(后进先出)。从这个意义上说,由于
o
将是最后一个推送到堆栈中的字符,因此它将是第一个被输出的字符。。我希望,现在应该清楚了。如有任何进一步的疑问/问题,请随时发表评论。