2011-08-28 78 views
1

目前,我熟悉递归和试图达到进一步的理解,我想看看它在扭转字符串的上下文中。我知道它并不像使用StringBuffer那样高效,但就像我说的那样,主要是为了更好地理解。我知道在这方面有几个关于这方面的问题,但我只想在演练中提供一些帮助。语义理解递归反向字符串返回语句

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

字符串在这种情况下=“开始”

我知道子方法走的是一条不子的第一个字符

递归调用。 (部分)

reverse("Start") 
reverse("tart") 
reverse("art") 
reverse("rt") 
reverse("t") // when string is 1 char length then the reverse string is returned 

但我想深入了解它如何在递归演练中连接和重新构建字符串。

在此先感谢。

回答

5

声明

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

在说“反向最后n-1个字符和第一字符移动到结束”(其中,所述串具有长度n)。这是有道理的,如果你认为它跟踪通过递归调用:

reverse("tart") + "S" 
(reverse("art") + "t") + "S" 
((reverse("rt") + "a") + "t") + "S" 
(((reverse("t") + "r") + "a") + "t") + "S" 
((((reverse("") + "t") + "r") + "a") + "t") + "S" 

假设你离开的时候有一个空字符串一个合适的停车条件,方法调用现在会返回一个接一个:

(((("t") + "r") + "a") + "t") + "S" 
((("tr") + "a") + "t") + "S" 
(("tra") + "t") + "S" 
("trat") + "S" 
"tratS" 
+0

好的答案,但是当length()是零(空字符串)时,我会一直返回空字符串。你不想测试一个空字符串。 – adamjmarkham

+0

谢谢像素。那正是我需要的。竖起大拇指。 –

0

对于递归而言,最好根据基本情况和递归调用来思考。

我假设你有这样的:

public String reverse(String str){ 
    if (str.length() == 0) 
     return str; 

    return reverse(str.substring(1)) + str.charAt(0); 
} 

末返回调用刚刚从字符串采取的第一个字符,它串联到reverse递归调用。所以逐渐变短的字符串的第一个字符总是被追加到字符串的末尾,即变为颠倒。

而不是思考递归的每个阶段,最好只看基本情况和递归调用。使用归纳过程可以确保递归可行。

事实上,我认为在这种情况下,使用3个字符的字符串(例如“str”)来查看会发生什么会更容易。如果它适用于所有情况(这是归纳)。