lua学习笔记07

当一个函数内部嵌套另一个函数的定义时,内部函数体可以访问外部的函数的局部变量,这种特征我们称为词法定界。

function newCounter()
	local i = 0
	return function()
		i = i + 1
		return i
	end
end

c1 = newCounter()
print(c1())
print(c1())
print(c1())

非全局函数:

Lua中函数可以作为全局变量也可以作为局部变量,这时候需要注意函数和表语法:

--表和函数放在一起
Lib = {}
Lib.foo = function (x,y)  return x + y end
Lib.goo = function (x,y)  return x - y end
--使用表构造函数
Lib = {
	foo = function(x,y) return x + y end ,
	goo = function(x,y)  return x - y end
}
--另外一种语法
Lib = {}

function Lib.foo(x,y)
	return x + y
end

function Lib.goo(x,y)
	return x - y
end

当我们将函数保存在一个局部变量内时,我们得到一个局部函数,也就是说局部函数想局部变量一样在一定范围内有效。

--方式1
local f = function (...)
	...
end

local g = function(...)
	...
	f()
	...
end
--方式2
local function f(...)
   ...
end

--声明递归局部函数的方式

local fact

fact = function(n)
	if n == 0 then
		return 1
	else
		return n * fact(n - 1)
	end
end

--如果是直接递归调用也可以用下面的方式
local fact = function(n)
	if n == 0 then
		return 1
	else
		return n * fact(n - 1)
	end
end

--如果是间接递归调用只能用以下的方式
local f,g

function g()
	... f()...
end

function f()
	...g()...
end

尾调用

尾调用时一种类似在函数结尾的goto调用,当函数最后一个动作是调用另外一个函数的时候,我们称这种调用尾调用。

 

迷宫代码:

function room1()
	local move = io.read()
	if move == "s" then
		return room3()
	elseif move == "e" then
		return room2()
	else
		print("invalid move")
		return room1()
	end
end

function room2()
	local move = io.read()
	if move == "s" then
		return room4()
	elseif move == "w" then
		return room1()
	else
		print("invalid move")
		return room2()
	end
end

function room3()
	local move = io.read()
	if move == "n" then
		return room1()
	elseif move == "e"
		return room4()
	else
		print("invalid move")
		return room3()
	end
end

function room4()
	print("congratilations!!!!")
end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值