了解栈帧在递归函数中的工作原理

Understanding how stack frames work in recursive function

Python/CS 新手,试图了解特定递归函数的工作原理 "under the hood" 根据函数的堆栈帧的运行方式和它们的值 "holding."

我知道很多 written/posted 关于这里的递归函数,并且有说明它们如何工作的示例,但是递归的概念以及它们如何堆栈 work/what 它们在递归中的作用功能有点棘手,我没有找到任何清晰简洁的解释。

假设我们有以下递归函数来反转字符串中的字符:

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

输出:olleh

我认为 reverse_string(text[1:]) 的框架工作如下:

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"

但是在返回值"o"并且满足终止基本条件之后会发生什么? text[0] 在函数中如何工作最终到达 "olleh"

只是以你为例。

一旦达到终止条件,其余帧将按相反顺序弹出。

假设我们达到终止条件,在这种情况下 return text 是 "hit" 并且 text = "o" 是 returned。然后在前一帧中我们有 reverse_string(text[1:]) + text[0] 但这只是 reverse_string("o") + "l" = "o" + "l" = "ol" = reverse_string(text[1:]),其中 reverse_string(text[1:]) 是来自前一帧的调用(text 等于 "llo").继续这个逻辑,reverse_string("lo") + "l" = "ol" + "l" = "oll".

我们继续相同的想法,直到到达 "top" 帧,我们最终 return "olleh"。