递归反转字符串代码疑问:为何递归调用时字符串长度会递减?
递归反转字符串的长度递减原理解释
你编写的递归反转字符串代码逻辑正确,但核心困惑点在于每次递归调用时传入的是原字符串的子串,而非原字符串本身,所以长度才会逐步递减。下面结合输入"Bolton"(长度6)拆解整个递归过程:
你的代码实现
import stdio import sys # Entry point def main(): s = sys.argv[1] stdio.writeln(_reverse(s)) # Returns the reverse of the string s. def _reverse(s): # Base case: if s is the empty string, return an empty string. if len(s) == 0: return "" # Recursive step: return last character in s + _reverse(s excluding last character). else: return s[-1] + _reverse(s[:len(s)-1]) if __name__ == '__main__': main()
递归调用过程拆解(以"Bolton"为例)
每次调用_reverse时,函数参数都是新的子串,而非原字符串"Bolton",所以每个层级的s都是独立的:
- 第一次调用:
_reverse("Bolton"),此时len(s)=6,执行return "n" + _reverse("Bolto")(s[:5]即从开头到第4个索引,对应子串"Bolto",长度5) - 第二次调用:
_reverse("Bolto"),len(s)=5,执行return "o" + _reverse("Bolt")(s[:4]对应子串"Bolt",长度4) - 第三次调用:
_reverse("Bolt"),len(s)=4,执行return "t" + _reverse("Bol")(长度3) - 第四次调用:
_reverse("Bol"),len(s)=3,执行return "l" + _reverse("Bo")(长度2) - 第五次调用:
_reverse("Bo"),len(s)=2,执行return "o" + _reverse("B")(长度1) - 第六次调用:
_reverse("B"),len(s)=1,执行return "B" + _reverse("")(长度0) - 第七次调用:
_reverse(""),触发基准条件,返回空字符串""
之后开始回溯拼接结果:"" + "B" → "B",再加上"o"→"Bo",依次往上最终得到"notloB"。
简单说:每次递归都把当前字符串的最后一个字符去掉,生成一个更短的新子串传入下一层调用,所以每个层级的s长度都会比上一层小1,直到触发空字符串的终止条件。
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

