Function 理解递归和堆栈帧的遍历

Function 理解递归和堆栈帧的遍历,function,stack,stack-frame,Function,Stack,Stack Frame,这不是作业问题。我只是想了解这个过程,以供我自己启迪。作为一名计算机科学专业的学生,我参加过几次讨论递归概念的讲座。然而,在我看来,演讲者对于堆栈帧的概念以及如何遍历调用堆栈以计算最终值有点含糊不清。我目前设想的过程类似于自上而下构建一棵树(将项推到调用堆栈上——后进先出的数据结构),然后爬上新构建的树,在到达树顶时获得最终值。也许典型的例子是: def fact(n): if n == 0: ans = 1 else: ans = n * fa

这不是作业问题。我只是想了解这个过程,以供我自己启迪。作为一名计算机科学专业的学生,我参加过几次讨论递归概念的讲座。然而,在我看来,演讲者对于堆栈帧的概念以及如何遍历调用堆栈以计算最终值有点含糊不清。我目前设想的过程类似于自上而下构建一棵树(将项推到调用堆栈上——后进先出的数据结构),然后爬上新构建的树,在到达树顶时获得最终值。也许典型的例子是:

def fact(n):
    if n == 0: 
        ans = 1
    else:
        ans = n * fact(n-1)
    return ans

value = fact(5)
print (value)
如上所述,我认为调用堆栈最终类似于以下(粗略)绘制的图:

+----------+
|    5      |
|    4      | 
|    3      |
|    2      |
|    1      |
 +----------+
每个数字将被“封闭”在堆栈帧中,控制现在从底部(值为1)到2再到3,等等。不过,我不完全确定操作符在进程中的位置。假设在某一点上涉及抽象语法树(AST),或者存在包含运算符的第二个堆栈,我会错吗

谢谢你的帮助

~z~凯特琳


编辑:删除“递归”标记并添加“函数”和“堆栈帧”标记。

调用堆栈帧存储参数、返回地址和局部变量。代码(不仅仅是操作员)本身存储在其他地方。相同的代码在不同的堆栈帧上执行


你可以在这里找到更多的信息和可视化:

这个问题更多的是关于函数调用如何工作,而不是关于递归。调用函数时,将创建一个框架并将其推送到堆栈上。框架包括一个指向调用代码的指针,以便程序知道函数调用后返回的位置。运算符位于调用点之后的可执行代码中