Java字符串递归反转代码理解困惑求助
字符串反转递归代码的执行逻辑拆解
先明确你说的应该是这类标准递归反转代码:
public static String reverse(String s) { // 递归终止条件:空字符串直接返回 if (s.isEmpty()) { return s; } // 递归调用:取子串反转后,拼接当前字符串的第一个字符 return reverse(s.substring(1)) + s.charAt(0); }
拿输入"howdy"为例,一步步拆解执行过程,你就能明白为什么最终输出是"ydwoh":
- 第一层调用:
reverse("howdy"),字符串非空,执行reverse("owdy") + 'h',但此时reverse("owdy")还没计算完成,先暂停当前调用,进入下一层递归。 - 第二层调用:
reverse("owdy"),执行reverse("wdy") + 'o',同样暂停,进入下一层。 - 第三层调用:
reverse("wdy"),执行reverse("dy") + 'w',暂停,进入下一层。 - 第四层调用:
reverse("dy"),执行reverse("y") + 'd',暂停,进入下一层。 - 第五层调用:
reverse("y"),执行reverse("") + 'y',此时触达终止条件,reverse("")返回空字符串,所以这一层返回"" + 'y' = "y"。 - 回到第四层:拿到
reverse("y")的结果"y",拼接'd',返回"y" + 'd' = "yd"。 - 回到第三层:拿到
reverse("dy")的结果"yd",拼接'w',返回"yd" + 'w' = "ydw"。 - 回到第二层:拿到
reverse("wdy")的结果"ydw",拼接'o',返回"ydw" + 'o' = "ydwo"。 - 回到第一层:拿到
reverse("owdy")的结果"ydwo",拼接'h',最终返回"ydwo" + 'h' = "ydwoh"。
关于你疑惑的字符拼接存储位置:
Java的递归调用依赖方法栈,每一层递归调用都会在栈中创建一个栈帧,里面保存了当前方法的局部变量(比如s.substring(1)的结果、s.charAt(0)取到的字符)和执行状态。只有当递归触达终止条件开始往回走时,才会逐个取出栈帧里的字符,和下层递归返回的字符串进行拼接,最终把结果传递回最上层调用。
你之前误以为会直接返回"owdyh"这类结果,是因为没搞清楚递归的"先递后归"逻辑——递归是先不断深入到终止条件,再从底层开始逐步拼接返回,而不是在每一层直接拼接后返回。
内容的提问来源于stack exchange,提问作者patotskay
相关产品推荐
相关产品推荐

