当前位置: 首页 > 知识库问答 >
问题:

理解堆栈框架如何在递归函数中工作

施梓
2023-03-14

Python/CS新手,试图了解特定递归函数如何“在引擎盖下”工作,函数的堆栈框架如何运行,它们“持有”的值是什么

我知道这里有很多关于递归函数的文章/帖子,这里有它们如何工作的示例,但递归的概念和堆栈如何工作/它们在递归函数中的作用有点棘手,我找不到任何清晰简洁的解释。

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

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

其输出为:< code>olleh

我认为<code>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"

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

共有1个答案

隗星驰
2023-03-14

只是以你为榜样散步。

一旦我们达到终止条件,剩余的帧将以相反的顺序弹出。

假设我们到达了终止条件,在这种情况下< code>return text是“hit”并且< code>text = "o"被返回。然后,在前一帧中,我们有< code > reverse _ string(text[1:])text[0],但这只是< code > reverse _ string(" o ")" l " = " o " = " ol " = reverse _ string(text[1:]),其中< code > reverse _ string(text[1:])是来自前一帧的调用(其中< code>text等于" llo ")。继续这个逻辑,< code > reverse _ string(" lo ")" l " = " ol " " l " = " oll " 。

我们继续这个想法,直到到达“顶部”框架,最后返回“olleh”。

 类似资料:
  • 代码运行良好。只是我不明白。在递归部分有困难的。在此部分中:我的想法是,首先它将一直执行直到一个阈值。则它将执行一次。因此只会被赋值一次。显然那不是真的。 对我来说,困难的部分是在方法中,做什么?在方法中,、做什么?

  • 让我们回到函数,进行更深入的研究。 我们的第一个主题是 递归(recursion)。 如果你不是刚接触编程,那么你可能已经很熟悉它了,那么你可以跳过这一章。 递归是一种编程模式,在一个任务可以自然地拆分成多个相同类型但更简单的任务的情况下非常有用。或者,在一个任务可以简化为一个简单的行为加上该任务的一个更简单的变体的时候可以使用。或者,就像我们很快会看到的那样,处理某些数据结构。 当一个函数解决一

  • 我理解递归的逻辑,一个函数调用一个基例的函数然后终止,我在这里有一个代码,它记录一个简单的递归,我没有得到的是它开始记录达到条件,条件满足:0? 我希望这段代码首先记录输出,最后达到条件?

  • 正如标题所解释的,我有一个非常基本的编程问题,但我还没有找到。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”各种在线线程的回复我仍然不太明白。 当我们面对不知道自己不知道的事情时,我们可能会提出错误的问题或错误地提出正确的问题。我将分享我的“想法”。我的问题是希望有类似观点的人能够分享一些知识,帮助我打开递归灯泡! 以下是函数(语法用Swift编写): 我们将使用2和5作为参数:

  • 我正在研究这个简单的问题来练习基本Kotlin,在递归返回行上遇到了堆栈溢出,代码如下: 我对tailrec的理解是,它应该将递归函数转换为迭代函数,而迭代函数不会受到这种崩溃的影响。如果我没有正确实现尾部递归,编译器应该会发出错误。 有人能解释一下为什么这会像标准递归调用一样在大输入上崩溃吗?

  • 在前面的章节中,我们使用了一个栈图来表示一个程序在函数调用时所处的状态。 同样的图形也能使得递归函数的解释变得更容易些。 每次函数被调用,它都会创建一个新的实例,包含着函数的局部变量和参数。 本图说明了函数countdown的一个栈图,调用时n的初始值为3; 图中有一个main函数的实例和四个countdown函数的实例,每个实例中的参数n的值都不同。栈底的countdown实例n取值为0。它没有