個人理解 尾呼叫與遞迴

2021-08-13 05:43:41 字數 742 閱讀 3666

尾呼叫就是指某個函式的最後一步是呼叫另乙個函式。尾遞迴就是尾呼叫自身。

相信大家都看過阮老師的這篇文章《尾呼叫優化》

他是說,函式呼叫會在記憶體形成乙個」呼叫記錄」,又稱」呼叫幀」(call frame),儲存呼叫位置和內部變數等資訊。如果在函式a的內部呼叫函式b,那麼在a的呼叫記錄上方,還會形成乙個b的呼叫記錄。等到b執行結束,將結果返回到a,b的呼叫記錄才會消失。如果函式b內部還呼叫函式c,那就還有乙個c的呼叫記錄棧,以此類推。所有的呼叫記錄,就形成乙個」呼叫棧」(call stack)。

先要特別注意阮老師那個例子:

function f(x)這樣子也不是

這理解起來也不難。但是個人還有一種方法理解:

正常遞迴(非尾遞迴,尾部呼叫非自身)

function f(n)

用數學公式的角度就是f(x)=g(f(x-1))

假設函式內部的關係用g表示(加減乘除冪對數賦值等等),對於函式f的n次遞迴,正常的遞迴就是f(n)=g(f(n-1))=g(g(f(n-2)))=…=g(g(g(…..g(f(1))))),裡面要巢狀n個g,複雜度o(n)

尾遞迴(尾部呼叫自身,沒毛病,return就是f自己)

function f(n)

f(n)=f(n-1)=…=f(1)

複雜度就是o(1)

對於階乘、斐波那契數列那些,主要是難在把他轉換成f(n)=f(n-1)形式(例子網上多著,不列舉了)。而不懂行的人看起來,有沒有尾部遞迴也不是一眼秒看出來的

尾呼叫 尾遞迴

首先什麼是尾呼叫呢?我的理解是在,函式的最後呼叫乙個函式,並不包含該函式的任何變數。如 def f n return g n 複製 這個就是尾呼叫,尾呼叫的乙個好處就是,不用生成呼叫棧,因為假設是個尾呼叫,那麼當我執行到函式末尾的時候,這個函式相關的資訊我都可以不用保留了,因此不會出現棧溢位的問題。...

遞迴尾呼叫

什麼是遞迴尾呼叫 遞迴呼叫放在函式結尾 區別 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 ...

尾呼叫和尾遞迴

造成這樣的結果是因為每個函式在呼叫另乙個函式的時候,沒有return該呼叫,所以執行引擎會認為你還沒有呼叫完畢,會保留呼叫幀。而如果使用尾呼叫優化,呼叫幀就永遠只有一條,這個時候就會節省很大一部分的記憶體空間,維護了 執行的流暢性。以上 就叫做尾呼叫優化,這個時候呼叫幀就永遠只有一條,節省了部分記憶...