簡體   English   中英

理解遞歸和棧幀的遍歷

[英]Understanding Recursion and the Traversal of Stack Frames

不是一個家庭作業問題。 我只是想了解我自己的啟發過程。 作為一名計算機科學專業的學生,​​我參加了幾次講座,其中討論了遞歸的概念。 但是,在我看來,講師對於堆棧框架的概念以及如何遍歷調用堆棧以計算最終值略顯含糊。 我目前設想這個過程的方式類似於從上到下構建一個樹(將項目推送到調用堆棧 - 后進先出數據結構)然后爬上新構造的樹,在那里獲得最終值到達頂部。 也許是規范的例子:

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)或者是包含運算符的第二個堆棧?

謝謝您的幫助。

〜凱特琳

編輯:刪除'recursion'標簽並添加'function'和'stackframe'標簽。

調用堆棧幀存儲參數,返回地址和局部變量。 代碼(不僅是運營商)本身存儲在別處。 在不同的堆棧幀上執行相同的代碼。

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

這個問題更多的是關於函數調用是如何工作的,而不是關於遞歸的。 調用函數時,會在堆棧上創建並推送框架。 該幀包括指向調用代碼的指針,以便程序知道在函數調用之后返回的位置。 在調用點之后,操作員駐留在可執行代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM