Java递归反向字符串

时间:2014-05-21 14:02:55

标签: java recursion

您好我正在尝试理解下面的递归方法,但它似乎太混乱了。我知道reversePrint方法称之为自我,但问题是,第一次运行它应该打印bcdef + a = bcdef。这是我感到困惑的地方,下次运行时b成为charAt(0)......所以在哪里?他们是否暂时存储在某个地方?有人可以帮我理解它。非常感谢

public static void main(String[] args) {
    // TODO code application logic here
    System.out.println(reversePrint("abcdef"));
}

public static String reversePrint(String s) {
    if (s.length() <= 1) {
        return s;
    }
    return reversePrint(s.substring(1)) + s.charAt(0);
}

2 个答案:

答案 0 :(得分:7)

让我们稍微研究一下这个例子:

首先致电reversePrint("abcdef")。要缩写,我只需将其写为rev(abcdef)

rev(abcdef)

= rev(bcdef) a     // Take the beginning (a) and put it on the end.
= (rev(cdef) b) a 
= ((rev(def) c) b) a
= (((rev(ef) d) c) b) a
= ((((rev(f) e) d) c) b) a

= fedcba

在每一步中,我们都会对原始子字符串的rev进行评估。首先,我们评估rev(abcdef)。但要解决这个问题,我们需要评估rev(bcdef),为此我们需要rev(cdef)等等。

我们一直向下工作到rev(f),这只是f。然后我们将一个字符串连接到下一个字符串,最后得到rev(abcdef) = fedcba

我建议观看Khan Academy's video on recursion(使用Fibonacci序列)。他在这方面做得很好。

答案 1 :(得分:0)

首先,它将第一个字符和剩余字符串之间的字符串分开,此过程重复进行,直到字符串的长度小于或等于1.

abcdef 
  bcdef   a
   cdef   b
     def  c
       ef d
        f e
          f

再次终止编译器上升到堆栈然后生成最终结果。

... FEDCBA 希望很清楚。