gpt4 book ai didi

lua - lua中的尾调用优化

转载 作者:行者123 更新时间:2023-12-04 00:39:08 25 4
gpt4 key购买 nike

Lua声称它正确实现了尾调用,因此不需要为每次调用维护堆栈从而允许无限递归,我尝试编写一个sum函数,一个不是尾调用,一个是尾调用:

非尾声版本

function sum(n)
if n > 0 then
return n + sum(n-1)
end
end

print(sum(1000000))

堆栈溢出如预期。

尾呼版本
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

最佳答案

Lua 中的尾调用 必须有以下形式

return fct(args)

所以你的尾调用版本必须重写为:
function sum2(accu, n)
if n > 0 then
accu.value = accu.value + n
return sum2(accu, n-1) --< note the return here
end
end

关于lua - lua中的尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13303347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com