Java递归反向字符串

Bob*_*Bob 0 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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*onn 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
Run Code Online (Sandbox Code Playgroud)

在每一步,我们评估rev原始的子串.所以首先我们评估rev(abcdef).但要解决这个问题,我们需要评估rev(bcdef),为此我们需要rev(cdef)等等.

我们来解决这一问题到一路rev(f),这仅仅是f.然后我们将一个字符串连接到下一个字符串,最后我们结束rev(abcdef) = fedcba.

我建议观看可汗学院关于递归的视频(使用Fibonacci序列).他在这方面做得很好.