Lua函式的尾呼叫

2021-07-30 00:23:10 字數 1403 閱讀 4002

1. 尾呼叫

所謂尾呼叫,就是乙個函式返回另乙個函式的返回值:

**如下:

function f()

…return g()

en

因為呼叫g()後,f()中不再執行任何**,所以不需要保留f()的呼叫桟資訊;lua做了這樣的優化,稱為"尾呼叫消除",g()返回後,控制點直接返回到呼叫f()的地方。

這種優化對尾遞迴非常有益,通常遞迴意味著呼叫桟的不斷增長,甚至可能造成堆疊溢位;而尾遞迴提供了優化條件,編譯器可以優化掉呼叫桟。 

下面的遞迴函式沒有使用尾遞迴,而引數為大數時,堆疊溢位:

**如下:

function f(n)

if n <= 0 then

return 0

enda = f(n-1)

return n * a

endf(10000000000)

stdin:5: stack overflow

stack traceback:

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

...stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:5: in function 'f'

stdin:1: in main chunk

[c]: in ?

優化為尾遞迴

**如下:

function f(n, now)

if n <= 0 then

return now

endreturn f(n-1, now*n)

endf(10000000000, 1)

執行n久也無堆疊溢位。

Lua (十)函式尾呼叫

概念 在乙個函式a中使用return返回另乙個函式b b函式呼叫是a函式的最後乙個動作 尾呼叫不占用 堆疊 空間,不會出現 棧溢位 可以起到優化儲存空間的作用。function fa return math.abs 1 endfunction fb return fa endprint fb 1fu...

lua 函式深入 閉合函式,區域性函式,尾呼叫

lua函式具有兩大特徵 函式作為第一類值,函式具有特定的詞法域 lexical scoping 所謂第一類值 代表函式和其他傳統型別的值是等價的 例如數字和字串 函式可以同他們一樣儲存在變數,table中,可以作為實參傳遞,可以作為函式返回值。對於第一類值,需要講明,函式和其他值一樣都是匿名的,是沒...

呼叫Lua函式

翻譯自http gamedevgeek.com tutorials calling lua functions 呼叫lua函式 這是lua指令碼語言教程系列之二。在第一篇中,我們學習了在windows和linux下編譯並執行 hello,world 程式。如果你沒有看過,請參考lua入門一文。這篇文...