lua学习笔记day04-----非全局函数和正确的尾调用

lua支持非全局函数,常见的有在表中定义函数。在表中定义函数的方式有多种:

例如:

lib = {

        foo = function (x,y)return x - y end

        goo = function (x,y) return x + y end

}


lib = {}

lib.foo = function (x,y) return x - y end        或者         function lib.foo (x,y)

lib.goo = function (x,y) return x+y end                                 return x - y 

                                                                                             end



还有一种常见的非全局函数,就是直接加上 local 关键字

local foo = function (x , y) return x - y end

local function foo(x , y)

           return x + y

           end


非全局函数的递归函数需要注意!


local f

local function   f(n)

         if  n = 0 then

              return 1 

         else 

            return n*f(n - 1)

         end

end         


当lua调用递归的时候,是不知道 f(n) 这个函数是非全局的,所以会去全局函数中寻找有没有这样的函数。

为了避免这样的问题,需要在函数前,声明函数。 


对于那种非直接递归的函数(1调用2,2再调用1).也需要先声明。


local f,g


local function f()

g()

end


local function g()

f()

end



lua可以正确的处理尾调用。

先来了解一下什么叫做尾调用。

function foo(n)

    if n > 0  then

      return f(n - 1)

    end

end


当g函数的最后一个动作是在调用f函数,且f函数不需要返回到g函数的时候,就叫做尾调用。


function f()

     g()

return 0

end

这样的情况就不是尾调用,而是一个正常的函数调用。


function f(n)

return n*g(n)

end


这种情况,也不是,f函数再调用完g函数之后,还需要和n进行计算。


那么正确的处理尾调用是什么呢?

当一个函数有一个尾调用,该函数不会再栈内保留调用函数的信息,这个样子就可以无限的尾调用,不会让栈溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值