public String reverse(String word) {
if ((word == null) || (word.length() <= 1)) {
return word;
}
return reverse(word.substring(1)) + word.charAt(0);
}
我有教授发给我的这段代码,但是我没有得到它。我知道什么是递归,但我仍然是Java编程的新手,所以如果有人愿意向我解释这个部分 return reverse(word.substring(1))+ word.charAt(0);
subString(1)做了什么,chartAt(0)是什么?
答案 0 :(得分:1)
这种方法的递归部分是反转字符串的方式,你删除第一个字符,反转剩下的字符,然后将第一个字符追加到结果中。这就是教授的代码所做的事情。
word.substring(1)
返回从索引1开始到结尾的子字符串word.charAt(0)
返回索引0 使用+
附加两个部分时会有更多的事情发生。问题是word.charAt(0)
的返回类型为char
。由于+
的左侧部分是String
,Java language rules表示如果右侧不是一个,则必须将右侧转换为String
。因此,char
值首先转换为Character
,然后调用toString()
类的Character
方法。这将返回由单个字符组成的String
。
编写该行可能是更有效的代码,如:
return reverse(word.substring(1)) + word.substring(0, 1);
substring
的双参数版本返回两个索引之间的子字符串。这将消除autoboxing并转换为String
。
答案 1 :(得分:1)
这是recursion。以下是subString()和charAt()的文档。 了解这是如何工作的:
public static String reverse(String word) {
if ((word == null) || (word.length() <= 1)) {
return word;
}
return reverse(word.substring(1)) + word.charAt(0);
}
Pass1:反向(“用户”):return reverse("ser")+'u';
Pass2:反向(“ser”)+'u':return reverse("er")+'s'+'u';
Pass3:反向(“呃”)+'s'+'u':return reverse("r")+'e'+'s'+'u';
Pass4:反向(“r”)+'e'+'s'+'u':return 'r'+'e'+'s'+'u';
//因为这里"r".length()==1
答案 2 :(得分:1)
return reverse(word.substring(1)) + word.charAt(0);
你应该这样读:
word
如果你假设这个函数反转长度为N的字符串,你可以很容易地看到它必须反转长度为N + 1的字符串。如果你发现最多只有一个字母的单词是相反的(前三行代码),你可以使用Mathematical Induction完成一个非常简单的证明,这个函数真的会反转字符串。