什麼是尾呼叫優化?
尾呼叫是函式式程式設計的乙個重要概念,本身非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。
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之後,還有別...