了解使用拼接的递归函数的控制流程
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
...这是对函数的最上层调用的结果。
我似乎无法理解这是为什么,一旦在递归函数中满足终止基本条件,该函数就会继续调用自身并返回调用堆栈。
这是一个用 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
...这是对函数的最上层调用的结果。