码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-25 00:03:04      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:style   io   re   c   cti   ar   应用   设计   

            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

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

标签:style   io   re   c   cti   ar   应用   设计   

原文地址:http://my.oschina.net/u/223340/blog/294615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!