es函式之尾呼叫優化

2021-09-08 05:37:24 字數 1195 閱讀 7409

什麼是尾呼叫優化?

尾呼叫是函式式程式設計的乙個重要概念,本身非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。

function f(x)
上面**中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。

以下三種情況,都不屬於尾呼叫。

// 情況一

function f(x)

// 情況二

function f(x)

// 情況三

function f(x)

尾呼叫不一定出現在函式尾部,只要是最後一步操作即可。

function f(x) 

return n(x);

}

尾呼叫之所以與其他呼叫不同,就在於它的特殊的呼叫位置。

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

尾呼叫由於是函式的最後一步操作,所以不需要保留外層函式的呼叫幀,因為呼叫位置,內部變數等資訊都不會再用到了,只要直接用內層函式的呼叫幀,取代外層函式的呼叫幀就可以了。

function f() 

f();

// 等同於

function f()

f();

// 等同於

g(3);

上面**中,如果函式g不是尾呼叫,函式f就需要儲存內部變數m和n的值、g的呼叫位置等資訊。但由於呼叫g之後,函式f就結束了,所以執行到最後一步,完全可以刪除f(x)的呼叫幀,只保留g(3)的呼叫幀。

這就叫做「尾呼叫優化」(tail call optimization),即只保留內層函式的呼叫幀。如果所有函式都是尾呼叫,那麼完全可以做到每次執行時,呼叫幀只有一項,這將大大節省記憶體。這就是「尾呼叫優化」的意義。

注意,只有不再用到外層函式的內部變數,內層函式的呼叫幀才會取代外層函式的呼叫幀,否則就無法進行「尾呼叫優化」。
function addone(a)

return inner(a);

}

尾呼叫優化

尾呼叫 tail call 是函式式程式設計的乙個重要概念,本文介紹它的含義和用法。一 什麼是尾呼叫?尾呼叫的概念非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下兩種情況,都不屬於尾呼叫。情況一...

尾呼叫優化

本文 日期 2015年4月10日 尾呼叫 tail call 是函式式程式設計的乙個重要概念,本文介紹它的含義和用法。尾呼叫的概念非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下兩種情況,都不屬...

尾呼叫優化

尾呼叫的概念非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下兩種情況,都不屬於尾呼叫。情況一 function f x 情況二 function f x 上面 中,情況一是呼叫函式g之後,還有別...