了解使用拼接的递归函数的控制流程

Understanding control flow of recursive function that uses splicing

我似乎无法理解这是为什么,一旦在递归函数中满足终止基本条件,该函数就会继续调用自身并返回调用堆栈。

这是一个用 Python 2.7 编写的递归函数示例:

text = "hello"
def reverse_string(text):
        if len(text) <= 1:
            return text
        return reverse_string(text[1:]) + text[0]

使用 Python visualizer,我了解函数如何使用 reverse_string(text[1:]) 调用自身并且每个帧的创建方式如下:

Frames
Global frame
text    "hello"
reverse_string  

reverse_string
text    "hello"

reverse_string
text    "ello"

reverse_string
text    "llo"

reverse_string
text    "lo"

reverse_string
text    "o"

Return
value   "o"

我的问题是:为什么当满足基本条件时(text = "o"时)会触发 text[0] 开始运行?我在想 return statement/line 上的所有代码会同时一起工作,不明白为什么 reverse_string(text[1:]) 先发生,然后 text[0] - 又一次,为什么text[0] 是否在满足基本条件时激活?

如果您实际写出调用以及从每个调用返回的内容,可能更有意义。从最上面的 reverse("hello") 开始(抱歉——因为我懒惰打字而缩短了 reverse_string):

1: return reverse('ello') + 'h'
2:    return reverse('llo') + 'e'
3:       return reverse('lo') + 'l'
4:          return reverse('o') + 'l' 
5:             return 'o'

没有更多的调用要做,所以我们按照我们的方式返回调用堆栈,返回时返回连接的结果:

'o' is returned from 5
'ol' is returned from 4
'oll' is returned from 3
'olle' is returned from 2
'olleh' is returned from 1

...这是对函数的最上层调用的结果。