Lua程序设计 函数 正确的尾调用

            Lua中的“尾调用”就是一种相似于goto的函数调用,当一个函数调用是另外一个函数的最后一个动做时,该调用才算是一条“尾调用”。【一个函数在调用完另外一个函数以后,是否就无其余事情须要作了】函数

function f(x) return g(x) end
  也就是说,当f调用完g以后,f所表明的整个函数的调用才算执行完成也就无其余事情可作了。所以,这种状况中,程序就不须要返回那个“尾调用”所在的函数了。
因此在“尾调用”以后,程序也不须要保存任何关于该函数的栈信息了。
 当g返回时,执行控制权能够直接返回到调用f的那个点上。

            Lua中进行“尾调用”时不耗费任何栈空间。因此一个程序能够拥有无数嵌套的“尾调用”。lua

function foo(n) 
  if n > 0 then return foo(n - 1) end
end
调用以上函数时,传入任何数字做为参数都不会形成栈溢出。

        如下示例均不是“尾调用”spa

 return g(x) + 1 ----必须作一次加法。
 return x or g(x) ----必须调整为一个返回值。
return (g(x))   ----必须调整为一个返回值。
调用完一个函数以后就无需作其余事情了。

         在Lua中,只有“return <func> (<args>)”这样的调用形式才算是一条“尾调用”,Lua会在调用前对<func>及其参数求值,因此它们能够是任意复杂的表达式。code

return x[i].foo(x[j] + a*b, i+j)

        Lua中“尾调用”的一大应用就是编写“状态机”。这种程序一般以一个函数来表示一个状态,改变状态就是goto到另外一个特定的函数。io

相关文章
相关标签/搜索