0
    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) 做什么?

4

3 回答 3

1
return reverse(word.substring(1)) + word.charAt(0);

你应该这样读:

  • 删除第一个字母word
  • 反转其余部分(递归调用)
  • 把第一个字母放在最后

如果您假设此函数反转长度为 N 的字符串,您可以很容易地看到它必须反转长度为 N+1 的字符串。如果您意识到如果反转(前三行代码)最多包含一个字母的单词是相同的,那么您使用数学归纳法得到了一个完整的非常简单的证明,即该函数确实反转了字符串。

于 2013-04-19T17:19:53.157 回答
1

递归部分的工作方式是反转字符串,删除第一个字符,反转剩下的内容,然后将第一个字符附加到结果中。这就是教授的代码正在做的事情。

  • word.substring(1)返回从索引 1 开始到末尾的子字符串
  • word.charAt(0)返回索引 0 处的字符

当这两个部分使用+. 问题是它word.charAt(0)的返回类型为char. 由于 the 的左侧部分+是 a StringJava 语言规则规定如果右侧String不是 a ,则必须将其转换为 a 。所以char首先将值转换为a Character,然后调用该类的toString()方法。Character这将返回一个String由单个字符组成的。

编写该行的代码可能更有效,例如:

return reverse(word.substring(1)) + word.substring(0, 1);

的双参数版本substring返回两个索引之间的子字符串。这将消除自动装箱和转换为String.

于 2013-04-19T17:05:16.580 回答
1

这是递归。这是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: reverse("er")+'s'+'u' :return reverse("r")+'e'+'s'+'u';

Pass4: reverse("r")+'e'+'s'+'u' : return 'r'+'e'+'s'+'u';// 因为这里"r".length()==1

于 2013-04-19T17:07:26.260 回答