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