以協(xié)同程序?qū)崿F(xiàn)迭代器
需求 : 對 {"a","b","c"} 所有的排列組合情況輸出
排列組合情況
- 普通實(shí)現(xiàn)(沒有使用協(xié)同程序)
function permgen( a , n ) -- a 是要進(jìn)行排列組合的數(shù)字,n a的長度
n = n or #a -- 默認(rèn)n為a的大小
if n<=1 then
printResult(a)
else
for i=1 , n do
a[n] , a[i] = a[i] , a[n] -- 將第i個元素放到數(shù)組的末尾
permgen( a , n-1 ) -- 生成其余的元素的排列
a[n] , a[i] = a[i] , a[n] -- 恢復(fù)第i個元素
end
end
end
function printResult(a)
for i = 1 , #a do
io.write(a[i] , " ")
end
io.write("\n")
end
permgen({1,2,3,4})
- 以協(xié)同程序?qū)崿F(xiàn)迭代器
function permgen( a , n ) -- a 是要進(jìn)行排列組合的數(shù)字,n a的長度
n = n or #a -- 默認(rèn)n為a的大小
if n<=1 then
coroutine.yield(a) -- printResult(a)
else
for i=1 , n do
a[n] , a[i] = a[i] , a[n] -- 將第i個元素放到數(shù)組的末尾
permgen( a , n-1 ) -- 生成其余的元素的排列
a[n] , a[i] = a[i] , a[n] -- 恢復(fù)第i個元素
end
end
end
function printResult(a)
for i = 1 , #a do
io.write(a[i] , " ")
end
io.write("\n")
end
function permutations(a)
local co = coroutine.create(
function() permgen(a) end
)
return function() -- 迭代器
local code , res = coroutine.resume(co)
return res
end
end
for p in permutations({"a","b","c"}) do
printResult(p)
end
- wrap 函數(shù)
function permgen( a , n ) -- a 是要進(jìn)行排列組合的數(shù)字,n a的長度
n = n or #a -- 默認(rèn)n為a的大小
if n<=1 then
coroutine.yield(a) -- printResult(a)
else
for i=1 , n do
a[n] , a[i] = a[i] , a[n] -- 將第i個元素放到數(shù)組的末尾
permgen( a , n-1 ) -- 生成其余的元素的排列
a[n] , a[i] = a[i] , a[n] -- 恢復(fù)第i個元素
end
end
end
function printResult(a)
for i = 1 , #a do
io.write(a[i] , " ")
end
io.write("\n")
end
function permutations(a)
return coroutine.wrap( function() permgen(a) end )
end
for p in permutations({"a","b","c"}) do
printResult(p)
end