Lua 是否有可能对卢阿的河内塔进行适当的跟踪检查?

Lua 是否有可能对卢阿的河内塔进行适当的跟踪检查?,lua,tail-recursion,towers-of-hanoi,tail-call,Lua,Tail Recursion,Towers Of Hanoi,Tail Call,我用递归编写了河内塔问题的代码,并在在线lua编译器上运行。如果输入超过14,它就不会运行 localnum=io.read(“*n”) 本地计数=0 河内功能区(北、圣、中、夏令时) 如果n==1,则 计数=计数+1 打印(st、dst) 其他的 河内(北区1号,圣彼得堡,中部) 计数=计数+1 打印(st、dst) 河内(北纬1度,中部,圣彼得堡) 结束 结束 河内(数字,1,2,3) 打印(计数) 我认为这可以通过适当的尾部调用来解决,但据我所知,适当的尾部调用必须返回相同的函数。但在该

我用递归编写了河内塔问题的代码,并在在线lua编译器上运行。如果输入超过14,它就不会运行

localnum=io.read(“*n”)
本地计数=0
河内功能区(北、圣、中、夏令时)
如果n==1,则
计数=计数+1
打印(st、dst)
其他的
河内(北区1号,圣彼得堡,中部)
计数=计数+1
打印(st、dst)
河内(北纬1度,中部,圣彼得堡)
结束
结束
河内(数字,1,2,3)
打印(计数)
我认为这可以通过适当的尾部调用来解决,但据我所知,适当的尾部调用必须返回相同的函数。但在该代码中,递归中有两个“hanoi”函数


这在lua是一个合适的尾部调用吗

function f(args)
    return f(args_1), f(args_2)
end


有没有办法对河内问题进行正确的尾部调用?

正确的尾部调用不是调用同一个函数。对任何函数的调用都是尾部调用,如果该调用发生在所需的条件下,并且不限于递归

在您的示例中:

function hanoi(n, st, mid, dst)
    if n == 1 then
        count = count + 1
        print(st, dst)
    else
        hanoi(n-1, st, dst, mid) -- you continue after this call,
                                 -- possibly expecting the result, this call
                                 -- can't be a proper tail call
        count = count + 1
        print(st, dst)

        hanoi(n-1, mid, st, dst) -- this call can be made a tail call,
                                 -- just return the result of that call

        return hanoi(n-1, mid, st, dst) -- now this is a proper tail call
    end
end
函数必须返回调用结果,不能使用或更改调用结果

在您的河内示例中,只有第二个调用可以作为尾部调用,而不是第一个调用