正确地尾调用

Lua支持“尾调用消除”

当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用”,

以下代码对g的调用就是一条“尾调用”:

    function  f(x)  return g(x)  end

也就是说,当f调用完g之后就再无其他事情可做了,因此在这种情况中,程序就不需要返回那个“尾调用”所在的函数了。

所以在“尾调用”之后,程序也不需要保存任何关于该函数的栈信息了。当g返回时,执行控制权可以直接返回到调用f的那个点上。

在进行“尾调用”时不耗费任何栈空间,将这种实现称为支持“尾调用消除”.

在Lua中,只有“return <func>(<args>)”这样的调用形式才算是一条“尾调用”。


“尾调用”的一大应用就是编写“状态机”,改变状态就是goto到另一个特定的函数。

如:一个迷宫有几间房间,每间房间中最多有东南西北4扇门。用户在每一步移动中都需要输入一个移动的方向,如果在某个方向上有门,那么用户就可以进入相应的房间,

不然,程序就打印一条警告。游戏目标就是让用户从最初房间走到最终的房间。

function room1()

  local  move  =io.read()

  if move== "south"  then return room3()

  elseif move =="east" then return room2()

  else

    print("invalid move")

    return room1()    -- stay in the same room

  end

end


function room2()

   local  move =io.read

      if move =="south"  then  return room4()

      elseif  move== "west" then return room1()

     else

        print("invalid move")

        return room2()

   end

end


function room3()

local move =io.read()

if move =="north" then return room1()

elseif move== "east" then return room4()

else

   print("invalid move")

return room3()

end

end


function  room4()

   print("congratulations!")

end





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值