理解递归和栈帧的遍历

时间:2014-03-15 08:05:58

标签: function stack stackframe

这是一个家庭作业问题。我只是试图理解我自己的启发过程。作为一名计算机科学专业的学生,​​我参加了几次讲座,其中讨论了递归的概念。但是,在我看来,讲师对于堆栈框架的概念以及如何遍历调用堆栈以计算最终值略显含糊。我目前设想这个过程的方式类似于从上到下构建一个树(将项目推送到调用堆栈 - 后进先出数据结构)然后爬上新构造的树,在那里获得最终值到达顶部。也许是典型的例子:

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)或者是包含运算符的第二个堆栈?

感谢您的帮助。

〜凯特琳

编辑:删除了#39;递归'标签和添加功能'和' stackframe'标签

2 个答案:

答案 0 :(得分:1)

调用堆栈帧存储参数,返回地址和局部变量。代码(不仅是运营商)本身存储在别处。在不同的堆栈帧上执行相同的代码。

您可以在此处找到更多信息和可视化:http://www.programmerinterview.com/index.php/recursion/explanation-of-recursion/

答案 1 :(得分:1)

这个问题更多的是关于函数调用是如何工作的,而不是关于递归的。调用函数时,会在堆栈上创建并推送框架。该帧包括指向调用代码的指针,以便程序知道在函数调用之后返回的位置。操作员在呼叫点之后驻留在可执行代码中。