尾調用 & 尾遞歸

首先什麼是尾調用呢? 個人理解是在,函數的最後調用一個函數,並不包含該函數的任何變量。如:函數

def f(n):
    return g(n)
複製代碼

這個就是尾調用,尾調用的一個好處就是,不用生成調用棧,由於假設是個尾調用,那麼當我執行到函數末尾的時候,這個函數相關的信息我均可以不用保留了,所以不會出現棧溢出的問題。spa

以下不是尾調用:code

def f(n):
    x = 1
    return x * g(n)
複製代碼

這樣由於函數的末尾還須要用到f函數的變量,所以不能釋放這個棧的內容,所以會在f函數的上方,再生成一個函數的調用棧。遞歸

尾調用一個很差的地方其實就是很差理解代碼,由於可能會在函數的末尾新添加一些參數,來生成尾調用。class

下面再來講一下尾遞歸,尾遞歸其實就是特殊的尾調用。變量

如:copy

def f(n):
    if (n == 1):
        return 1
    return f(n - 1)
複製代碼

這樣的寫法不會形成棧的溢出,否者若是n的值過大,那麼就會出現棧溢出。co

相關文章
相關標籤/搜索