Lua声称它正确地实现了尾调用,因此无需为每个调用维护堆栈,从而允许无限递归。我试图编写一个求和函数,其中一个不是尾调用,而另一个是尾调用:
非尾调用版本
function sum(n)
if n > 0 then
return n + sum(n-1)
end
end
print(sum(1000000))
从stackoverflow获取的内容如预期一样。
尾调用版本
function sum2(accu, n)
if n > 0 then
accu.value = accu.value + n
sum2(accu, n-1)
end
end
local accu = {value = 0}
sum2(accu, 1000000)
print(accu.value)
虽然这是一个尾调用,我认为这种情况下也不会出现stackoverflow,但它仍然因为stackoverflow而失败了:
/bin/lua/5.1.4/bin/lua: tailcall.lua:13: stack overflow
stack traceback:
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
...
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:13: in function 'sum2'
tailcall.lua:17: in main chunk
[C]: ?
lua是否真的支持尾调用优化,还是我的函数实际上并没有进行尾调用?
我正在Redhat 5上使用lua 5.1.4。
return n+sum(n-1)
在Lua中被理解为n
与sum(n-1)
的结果之间的操作。为了成为尾调用,Lua期望返回值直接是一个函数调用。请注意:return somefunc(n+1)
在这种情况下,Lua将其理解为带有参数n+1的调用,因此作为尾调用进行处理。 - Arkt8