协同与迭代器

-----------------------------生产数组的全排列--------------------------------
function permgen(a, n)
    n = n or #a --默认n为a的大小
    if n <= 1 then
        --printResult(a)
        coroutine.yield(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 permutation(a)
    local co = coroutine.create(function() permgen(a) end)
    return function() --迭代器
            local code, res = coroutine.resume(co)
            return res
        end
end

for p in permutation({‘a‘, ‘b‘, ‘c‘}) do
    printResult(p)
end
时间: 2024-07-29 00:12:26

协同与迭代器的相关文章

Lua总结

ref http://book.luaer.cn/ 基础 弱类型,没有类型定义 解释型语言,但是会通过编译器先编译成中间码然后再执行 字符串的处理:用table保存,最后table.concat(t, "\n") .. "\n".防止..引起的性能问题 注释: -- 块注释:-[[ ]] 没有++,+= 打印:print(a, b, c, "", 1) 字符串:'或者"均可 或者[[包含'和"]] 不需要声明类型,语句结束不需

chapter9_3 协同程序实现迭代器

将循环迭代器视为"生产者-消费者"模式的一种特例:迭代器产生的数据供循环体消费. 因此,用协同程序写迭代器就理所当然了.因为协同程序可以一改传统调用者与被调用者之间的关系. 有了这个特性,在写迭代器时就无须顾及如何在每次成功的迭代调用间保持状态了. function permgen(a,n) n = n or #a --默认的n是数组a的大小 if n <= 1 then --只有一个元素,不需要排列 printresult(a) else for i = 1,n do a[n]

《Lua程序设计》9.3 以协同程序实现迭代器 学习笔记

例:编写一个迭代器,使其可以遍历某个数组的所有排列组合形式.代码如下: function permgen(a, n) 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] -- 生成其余元素的排列 permgen(a, n-1) -- 恢复第i个元素 a[n], a[i] = a[i], a[n] end

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

lua中的迭代器与泛型for

任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器.lua中常常使用函数来描述迭代器,每次调用该函数都返回集合的下一个元素.每一个迭代器都需要保存一些状态来知道当前处于什么位置和如何进行下一次迭代.对于这样的任务,闭包提供了很好的机制来完成.一个典型的闭包结构包含两个函数:一个是闭包自身,一个是创建闭包的工厂. 例如,我们可以写过简单的list迭代器,让他仅仅返回值. function values( t ) local i = 0; return function() i = i +

【转】Unity中的协同程序-使用Promise进行封装(一)

原文:http://gad.qq.com/program/translateview/7170767 译者:陈敬凤(nunu)    审校:王磊(未来的未来) 每个Unity的开发者应该都对协同程序非常的熟悉.对于很多Unity的开发者而言,协同程序就是用来编写大量异步和延时任务的一种方法.如果你不在乎速度的话,有非常非常多的特殊方法可以在任何所需的时间暂停和恢复执行.在实践中,它们可以营造一种并发函数的幻觉 (虽然他们与线程无关!).然而,协同程序会有一些问题,许多程序员在使用协同程序的时候会

ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路

2017年2月19日, 星期日 ItemCF_基于物品的协同过滤 1.    概念 2.    原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3.    java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第二步:构建用户的得分矩阵 第三步:同现矩阵*评分矩阵 第四步:拿到最终结果,排序,得到给用户的推荐列表 问题一:物品同现矩阵和用户得分矩阵如何构建? 问题二:矩阵相乘如何来做?   六个MapReduce step1_第一个MapReduce: 目的-->去重去除数据

Chapter7 迭代器

结合泛型for的所有功能,写出更加简单,高效的迭代器. 1.迭代器和closure 迭代器是一种可以遍历集合中所有元素的机制.在Lua中用函数去表示它. 每调用一次,就返回下一个元素. 迭代器在两次成功调用期间,都需要保持一些状态,这样才能知道它所在的位置及如何步进到下一个位置. closure为此提供了一个很好的机制,一个closure就是一种可以访问upvalue的函数. 这些变量就可用于在成功调用之间保持状态值,从而使closure记住它在一次遍历中所在的位置. 因此,一个典型的closu

玩转Openstack之Nova中的协同并发(一)

玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下,但是由于前段时间工作上比较忙,加上为了履行诺言每天几更的来写设计模式系列性文章,故而拖到今天才写此次的总结.好吧,其实归根结底还是自己太懒了,趁着闲时在补新番小笼包之类的.废话就此打住,开始正文. Python中协程的介绍 在此之前,先介绍下Python中的并发,在Python中,并发有三种,分别