Lua中的“尾调用”就是一种类似于goto的函数调用,当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用”。【一个函数在调用完另一个函数之后,是否就无其他事情需要做了】
function f(x) return g(x) end 也就是说,当f调用完g之后,f所代表的整个函数的调用才算执行完成也就无其他事情可做了。因此,这种情况中,程序就不需要返回那个“尾调用”所在的函数了。 所以在“尾调用”之后,程序也不需要保存任何关于该函数的栈信息了。 当g返回时,执行控制权可以直接返回到调用f的那个点上。
Lua中进行“尾调用”时不耗费任何栈空间。所以一个程序可以拥有无数嵌套的“尾调用”。
function foo(n) if n > 0 then return foo(n - 1) end end 调用以上函数时,传入任何数字作为参数都不会造成栈溢出。
以下示例均不是“尾调用”
return g(x) + 1 ----必须做一次加法。 return x or g(x) ----必须调整为一个返回值。 return (g(x)) ----必须调整为一个返回值。 调用完一个函数之后就无需做其他事情了。
在Lua中,只有“return <func> (<args>)”这样的调用形式才算是一条“尾调用”,Lua会在调用前对<func>及其参数求值,所以它们可以是任意复杂的表达式。
return x[i].foo(x[j] + a*b, i+j)
Lua中“尾调用”的一大应用就是编写“状态机”。这种程序通常以一个函数来表示一个状态,改变状态就是goto到另一个特定的函数。
Lua程序设计 函数 正确的尾调用,布布扣,bubuko.com
原文地址:http://my.oschina.net/u/223340/blog/294615