有學LUA的朋友嗎,誰能解釋下這一段話呢,我有點不明白?關於尾調用的。


Lua中函數的另一個有趣的特征是可以正確的處理尾調用(proper tail recursion,一些書使用術語“尾遞歸”,雖然並未涉及到遞歸的概念)。

尾調用是一種類似在函數結尾的goto調用,當函數最后一個動作是調用另外一個函數時,我們稱這種調用尾調用。例如:

function f(x)

    return g(x)

end

g的調用是尾調用。

例子中f調用g后不會再做任何事情,這種情況下當被調用函數g結束時程序不需要返回到調用者f;所以尾調用之后程序不需要在棧中保留關於調用者的任何信息。一些編譯器比如Lua解釋器利用這種特性在處理尾調用時不使用額外的棧,我們稱這種語言支持正確的尾調用。

由於尾調用不需要使用棧空間,那么尾調用遞歸的層次可以無限制的。例如下面調用不論n為何值不會導致棧溢出。

3 个解决方案

#1


一般函數調用,棧都會保存函數的返回地址、返回值地址、參數列表。

按照你舉例子,g(x)的參數,可以使用f(x)中的變量的地址,g(x)的返回值,可以使用f(x)的返回值地址,g(x)后面沒有其他調用,所以,g(x)的函數返回地址空間,也可以直接使用f(x)的地址空間。

這樣看,在調用g(x)的時候,系統無需為其分配任何新的空間。

#2


這樣的尾調用實現遞歸有個缺陷,就是需要依賴於外部變量實現遞歸返回控制,語句話尾調用函數不能帶用來控制遞歸次數的參數,否則將變成常規棧遞歸,好在Lua可以在函數中創建子函數閉包加以利用,不會污染到常規變量名稱空間。

#3


不是缺陷,應該說是局限~

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com