灰气球

灰气球

Lua 用协同程序实现迭代器

125
2017-07-15

需求 : 对 {“a”,“b”,“c”} 所有的排列组合情况输出

普通实现(没有使用协同程序)

function permgen( a , n ) -- a 是要进行排列组合的数字,n a的长度
n = n or #a  -- 默认n为a的大小
if n<=1 then
    printResult(a)
else
    for i=1 , n do
        a[n] , a[i] = a[i] , a[n]  -- 将第i个元素放到数组的末尾
        permgen( a , n-1 )  -- 生成其余的元素的排列
        a[n] , a[i] = a[i] , a[n]  -- 恢复第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})

用协同程序实现迭代器

function permgen( a , n ) -- a 是要进行排列组合的数字,n a的长度
n = n or #a  -- 默认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个元素放到数组的末尾
        permgen( a , n-1 )  -- 生成其余的元素的排列
        a[n] , a[i] = a[i] , a[n]  -- 恢复第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 函数

function permgen( a , n ) -- a 是要进行排列组合的数字,n a的长度
n = n or #a  -- 默认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个元素放到数组的末尾
        permgen( a , n-1 )  -- 生成其余的元素的排列
        a[n] , a[i] = a[i] , a[n]  -- 恢复第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