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
将是最后一个推送到堆栈中的字符,因此它将是第一个被输出的字符。。我希望,现在应该清楚了。如有任何进一步的疑问/问题,请随时发表评论。