如何使用递归来反转String?

时间:2013-04-19 17:01:47

标签: java string recursion char substring

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

3 个答案:

答案 0 :(得分:1)

这种方法的递归部分是反转字符串的方式,你删除第一个字符,反转剩下的字符,然后将第一个字符追加到结果中。这就是教授的代码所做的事情。

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

使用+附加两个部分时会有更多的事情发生。问题是word.charAt(0)的返回类型为char。由于+的左侧部分是StringJava 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完成一个非常简单的证明,这个函数真的会反转字符串。