嗨,我正在尝试理解下面的递归方法,但它似乎太混乱了.我知道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)
让我们稍微研究一下这个例子:
你先打电话来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序列).他在这方面做得很好.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |