您好我正在尝试理解下面的递归方法,但它似乎太混乱了。我知道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);
}
答案 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 希望很清楚。