public static void main(String args[]) {
System.out.println(reverseString("His"));
}
public static String reverseString(String s) {
if (s.length() <= 1) {
return s;
} else {
char c = s.charAt(0);
return reverseString(s.substring(1)) + c;
}
}
有人可以详细解释我这个方法的工作原理
答案 0 :(得分:5)
我认为理解这些类型的方法如何工作的最好方法是通过一个简单的例子手工完成它们。让我们取字符串"abc"
并考虑当我们调用
reverseString("abc")
在第一次迭代中,我们考虑else
块(因为"abc".length()
不小于或等于1)。该方法返回
reverseString("abc".substring(1)) + "abc".charAt(0)
相当于
reverseString("bc") + 'a'
现在我们必须考虑reverseString("bc")
。再次,我们发现自己在else
块中,该方法将返回
reverseString("bc".substring(1)) + "bc".charAt(0)
相当于
reverseString("c") + 'b'
显然,reverseString("c")
只是"c"
- 所以reverseString("bc")
是"cb"
,上面的意思是reverseString("abc")
是"cb" + 'a'
我们"cba"
,正如所料。
总而言之,我们基本上是这样做的:
reverse("abc")
reverse("bc") + 'a'
reverse("c") + 'b' + 'a'
"cba"
使用4个字符的字符串:
reverse("abcd")
reverse("bcd") + 'a'
reverse("cd") + 'b' + 'a'
reverse("d") + 'c' + 'b' + 'a'
"dcba"
答案 1 :(得分:4)
假设您有一个字符串“Hello”,那么它将从左到右执行字符串的递归。
char c = s.charAt(0);
返回reverseString(s.substring(1))+ c;
1)对于H
c ='H'
返回reverseString(“ELLO”)+ H
2)对于E
c = 'E'
return reverseString("LLO") + E
3)对于E
c ='E'
返回reverseString(“LLO”)+ E
4)对于L
c ='L'
返回reverseString(“LO”)+ L
5)对于L
c ='L'
返回reverseString(“O”)+ L
6)因为,子串s <= 1
return S = 'O'
7)现在它将从下到上恢复递归函数并将连接 每个级别的所有字符串
所以,O + L + L + E + H =“OLLEH”
BTW,在java中,字符串反转是使用StringBuilder / StringBuffer的cakewalk。 例如StringBuffer的( “你好” .toReverse())的toString();
如果您使用的是单线程和更简单的应用程序,请使用StringBuilder
对于并发复杂的应用程序,请使用StringBuffer,即Synchrinized。
希望,这有帮助。
答案 2 :(得分:2)
这很简单。
如果使用一个char字符串调用方法,则返回相同的字符串并停止。否则,它将删除要追加到最后一个字符的第一个字符,并使用其余字符调用相同的方法。
以His
这样就可以了。
H
附加到最后一个并使用is
调用reverse方法。i
追加到最后一个,并使用s
调用reverse方法。1
,因此它将返回s
并且递归将停止。siH
返回。其他解释方式:
reverse("His" ) -> reverse("is" )+H -> ( reverse("s" )+i)+H -> (s+i)+H ->siH
希望这有帮助。
答案 3 :(得分:2)
在那里放一些print语句,看看用什么参数调用reverseString
方法。这是你会得到的:
his
is
s
因此,每次函数递归时,它都会使用s.substring(1)
删除第一个字符。然后它添加了切掉的第一个字符到反转该子字符串的结果。使用相同的上述三个调用,这看起来像:
reverse(is) + h
reverse(s) + i
s
注意最后一个案例只返回单个字母“s”。这称为递归的基本情况,每个递归函数都需要一个返回结果。
如果您将reverse(x)
的结果替换为上述三个电话,则会得到以下结果:
si + h
s + i
s
这就是它的工作原理。要反转字符串,请反转字母[1-n],然后在其末尾添加字母0。唯一的例外是反转一个单字母的字符串,它只返回一个字母的字符串本身。
答案 4 :(得分:0)
有趣的功能我几年没有做过java,但这就是它的工作方式。
检查以确保我们正在倒车的是多个角色,如果它不是返回它。 现在我们做的是我们取第一个字符并将其移动到字符串的末尾,然后我们返回其前面的其余字符串。
我最后结束了你的versering成为一个字符的字符串,第一个如果clausse告诫要返回的完整字符串。 :)
现在我确信有更好的方法可以解决这个问题。我确信java有一个反向字符串函数,如果你因为某些原因必须自己做这样的事情。它也许不起作用我从记忆中做到这一点,我的java生锈了
`public static String reverseString(String s){
for(int x=s.length(); x>=0; x--) {
s2 .= s.charAt(x);
}
return s2;`