Lua支持尾调用消除,就是一种类似于goto的函数调用。当一个函数调用另一个函数的最后一个动作时,改调用才算是一条尾调用。例如:function f(x) return g(x) end。当f调用完g之后就再无其他事情可做了。因此,程序就不需要返回那个尾调用所在的函数了。尾调用不耗费任何栈空间。判断准则:一个函数在调用完另一个函数之后,是否就无其他事情需要做了。
如下就不是尾调用:
function f(x) g(x) end 还需要丢弃g返回的临时结果
return g(x)+1 必须做一次加法
return x or g(x) 必须调整为一个返回值
return (g(x)) 必须调整为一个返回值