You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归反转字符串代码疑问:为何递归调用时字符串长度会递减?

递归反转字符串的长度递减原理解释

你编写的递归反转字符串代码逻辑正确,但核心困惑点在于每次递归调用时传入的是原字符串的子串,而非原字符串本身,所以长度才会逐步递减。下面结合输入"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都是独立的:

  1. 第一次调用:_reverse("Bolton"),此时len(s)=6,执行return "n" + _reverse("Bolto")(s[:5]即从开头到第4个索引,对应子串"Bolto",长度5)
  2. 第二次调用:_reverse("Bolto"),len(s)=5,执行return "o" + _reverse("Bolt")(s[:4]对应子串"Bolt",长度4)
  3. 第三次调用:_reverse("Bolt"),len(s)=4,执行return "t" + _reverse("Bol")(长度3)
  4. 第四次调用:_reverse("Bol"),len(s)=3,执行return "l" + _reverse("Bo")(长度2)
  5. 第五次调用:_reverse("Bo"),len(s)=2,执行return "o" + _reverse("B")(长度1)
  6. 第六次调用:_reverse("B"),len(s)=1,执行return "B" + _reverse("")(长度0)
  7. 第七次调用:_reverse(""),触发基准条件,返回空字符串""

之后开始回溯拼接结果:"" + "B" → "B",再加上"o"→"Bo",依次往上最终得到"notloB"。

简单说:每次递归都把当前字符串的最后一个字符去掉,生成一个更短的新子串传入下一层调用,所以每个层级的s长度都会比上一层小1,直到触发空字符串的终止条件。

内容的提问来源于stack exchange,提问作者Fab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:10:26