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

时间:2015-06-03 17:47:12

标签: python function recursion callstack

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

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

local.properties

使用Python visualizer,我理解函数如何使用text = "hello" def reverse_string(text): if len(text) <= 1: return text return reverse_string(text[1:]) + text[0] 调用自身,每个帧的创建方式如下:

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" )会触发文本[0]开始运行?我认为返回语句/行上的所有代码将同时协同工作,而不是先理解为什么text = "o"先发生,然后reverse_string(text[1:]) - 再次,为什么text[0]满足基本条件时激活?

1 个答案:

答案 0 :(得分:2)

如果您实际写出调用,然后从每个调用返回的内容,可能会更有意义。从最上面的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

...并且作为对函数的最高调用的结果返回。