lua中定义局部函数的时候通常有两种方法:1、local f = function() <body> end 2、local function f () <body> end。这两种情况在我们使用递归的时候需要注意。
第一种定义情况下的递归:
local foo = function(n)
if n == 0 then return 1
else return n*foo(n-1)
end
end
在函数调用
return n*foo(n-1)的时候,因为local foo定义的chunk还未结束。这样会调用一个全局的foo。当使用第二种方法定义的时候可以避免这样的事情发生
local function foo (n)
if n == 0 then return 1
else return n*foo(n-1)
end
end
在给函数传递参数的时候,func({1,2,3}) = func{1,2,3}
在函数这章中还讲到了“尾调用”。类似goto。一般函数的调用,栈都会保存函数的返回地址。使用尾调用,g(x)返回的地址可以直接使用f(x)
注释的代码是使用尾调用,程序一下子就计算出结果,第二种的时候报栈溢出