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