function permgen(a,n)
if(n == 0)then
coroutine.yield(a)
else
for i=1,n do
a[i],a[n] = a[n],a[i]
permgen(a,n -1)
a[i],a[n] = a[n],a[i]
end
end
end
function perm(a)
local n = #a
local co = coroutine.create(function ( )
permgen(a,n)
end)
return function ()
local code,res = coroutine.resume(co)
-- print(code,res)
if(code)then
return res
end
return nil
end
end
function printResult(a)
local str = a[1]
for i,v in ipairs(a) do
if(i ~= 1)then
str = str .. "," .. v;
end
end
print(str)
end
local arr = {"a","b","c"}
print("-----------------for in")
for p in perm(arr) do
printResult(p)
end
print("-----------------my print")
do
local foo = perm(arr)
while true do
local v1 = foo()
if(v1 == nil)then
break
end
printResult(v1)
end
end
主要用了协程的特性,在每一次输出了一个排列的时候yield
然后再循环里去resume协程,完成功能
为了理解for in结构,我在最下面写了与for in 等价的chrunk(代码块)来实现同样的效果
2017.6.14 23:53
新增笔记:
function perm(a )
local n = #a
return coroutine.wrap(function ()
permgen(a,n)
end)
end
上面这个版本的perm也可以实现前面的功能,
因为coroutine.wrap将一个函数包装成协程,然后返回一个函数,执行返回的函数,相当于执行了coroutine.resume
开源是一种精神