首页 > 代码库 > Lua程序设计 函数 正确的尾调用

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

            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到另一个特定的函数。