首先什麼是尾呼叫呢? 我的理解是在,函式的最後呼叫乙個函式,並不包含該函式的任何變數。如:
def f(n):
return g(n)
複製**
這個就是尾呼叫,尾呼叫的乙個好處就是,不用生成呼叫棧,因為假設是個尾呼叫,那麼當我執行到函式末尾的時候,這個函式相關的資訊我都可以不用保留了,因此不會出現棧溢位的問題。
如下不是尾呼叫:
def f(n):
x = 1
return x * g(n)
複製**
這樣因為函式的末尾還需要用到f函式的變數,因此不能釋放這個棧的內容,因此會在f函式的上方,再生成乙個函式的呼叫棧。
尾呼叫乙個不好的地方其實就是不好理解**,因為可能會在函式的末尾新新增一些引數,來生成尾呼叫。
下面再來說一下尾遞迴,尾遞迴其實就是特殊的尾呼叫。
如:
def f(n):
if (n == 1):
return 1
return f(n - 1)
複製**
這樣的寫法不會造成棧的溢位,否者如果n的值過大,那麼就會出現棧溢位。 尾呼叫和尾遞迴
造成這樣的結果是因為每個函式在呼叫另乙個函式的時候,沒有return該呼叫,所以執行引擎會認為你還沒有呼叫完畢,會保留呼叫幀。而如果使用尾呼叫優化,呼叫幀就永遠只有一條,這個時候就會節省很大一部分的記憶體空間,維護了 執行的流暢性。以上 就叫做尾呼叫優化,這個時候呼叫幀就永遠只有一條,節省了部分記憶...
遞迴尾呼叫
什麼是遞迴尾呼叫 遞迴呼叫放在函式結尾 區別 def fac n if n 0 return 1 else return n fac n 1 def print fa n if n 0 print fa n 1 print n print fa 10 結果 1到10def fac n if n 0 ...
關於尾呼叫和尾遞迴
1 尾呼叫 指某個函式的最後一步是呼叫另乙個函式。例如 function a n 最後一步呼叫並不意味著在函式的尾部,只要是最後一步即可 function a n return c n 2 什麼樣的情況不是尾呼叫 情況一 function f x 解釋 呼叫g之後,還有賦值操作,故不屬於尾呼叫。情況...