了解栈帧在递归函数中的工作原理
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"。
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"。