`
tjcjc
  • 浏览: 21563 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

迭代的相关内容

阅读更多
s = "hello"
puts s.enum_for(:each_char).map{|x| x.succ}       #=>[i,f,m,m,p]
#enum_for(function_name) 会返回一个枚举器,枚举器可以通过next来自行调用枚举的迭代
#而一般的比如array的each这些方法都会返回一个enumerator
#Enumerator定义了each方法又引入了enumeratable模块,可以使用很多迭代方法
#def each
#  loop  do
#     yield{self.next}
#  end
#end
enu=s.enum_for(:each_char)
print enu.next

#外部迭代器来并行迭代
def sequence(*enumerables, &block)
  enumerables.each { |element| element.each(&block) }
end

def interleave(*enumerables)
  enumerator = enumerables.map { |element| element.to_enum }
  while e = enumerator.shift
    begin
      yield e.next
    rescue StopIteration
    else
      enumerator << e
    end
  end
end

def bundle(*enumerables)
  enumerators = enumerables.map { |element| element.to_enum }
  loop {yield enumerators.map { |element| element.next }}
end

a,b,c=[1,2,3],4..6,'a'..'e'
sequence(a,b,c){|x| print x}
interleave(a,b,c){|x| print x}
bundle(a,b,c){|x| print x}

#为了防止迭代器在迭代过程中,数据发生变化,可以先拷贝一份,然后再进行迭代
module Enumerable
  def each_in_snapshot &block
    snapshot = self.dup
    snapshot.each &block
  end
end

#当array调用一个没有block的each方法时,他会返回一个enumerator,
# RETURN_ENUMERATOR(ary, 0, 0);而有block时,
#他会去完成代码块的相应任务
puts (1..4).to_a.each_in_snapshot.next
puts (1..4).to_a.each {}.class

#代码块的实参调用更像是并行赋值
{one: 1}.each { |k,v| }  #=>k,v=[key, value]
#so
def two
  yield 1, 2
end
two{|x| puts x}             #  x=1,2 => x=1
two{|x,| puts x}            #  x,=1,2 => x=1
two{|*x| puts x}            #  *x=1,2 => x=[1,2]

#**********************************************************
#Thread/fibers/continutions
#**********************************************************
thr = Thread.new{}
thr.value       #在Thread的block没有执行完之前,thr.value会被挂起

class Fibonacc
  def initialize
    @x, @y = 0, 1
    @fiber = Fiber.new do
      loop do
        @x, @y = @y, @x+@y
        Fiber.yield @x
      end
    end
  end

  def next
    @fiber.resume
  end

  def rewind
    @x,@y=0,1
  end
end

#可以通过纤程来创建一个有next功能的enumerator
class Generate
  def initialize(enumerable)
    @enumerable = enumerable
    create_fiber
  end

  def next
    @fiber.resume
  end

  def rewind
    create_fiber
  end
  
  private
  def create_fiber
    @fiber = Fiber.new do
      @enumerable.each do |ele|
        Fiber.yield ele
      end
    end
  end
end

x=Generate.new(5..6)
puts x.next

#纤程与调用纤程的进程间的参数传递
#Fiber如果初始化的时候有行参,那么第一次resume传近来的实参就是她的值
#fiber的代码快的返回值,是最后一次resume的结果
#resume的实参,就是代码块中的yield的结果
f=Fiber.new do |message|
  puts "Caller said #{message}"
  respond = Fiber.yield("Hello")
  puts "Caller said #{respond}"
  "Fine"
end

respond = f.resume("Hello")
puts "Fiber said #{respond}"
respond = f.resume("How are you")
puts "Fiber said #{respond}"

#
def line(symbol)
  callcc{|c| here=c;puts here}
  puts "here"
end
#当here.call时 第一个车here不会被打印出来,因为call只会到连续体的地方,但不会执行里面的代码
#所以会从第二行的here打印开始
#here.call(value)
#那么callcc的返回值就是here

require 'continuation'
class Generate
  def initialize
    load_generate
  end
  private
  def load_generate
    callcc do |c|
      @generator_context = c
      return
    end
    loop_generate
  end
  public
  def next
    callcc do |c|
      @main_context = c
      @generator_context.call
    end
  end
  private
  #它的作用就是让next可以顺序执行,
  #并且可以让loop_generate达到循环的目的
  def generate(val)
    callcc do |c|
      @generator_context = c
      @main_context.call(val)
    end
  end
end

class Fib < Generate
  def loop_generate
    a, b = 0, 1
    loop do
      generate b
      a, b = b, a+b
    end
  end
end

fib = Fib.new
puts fib.next
puts fib.next
puts fib.next
puts fib.next
puts fib.next

#**********************************************************
#Thread/fibers/continutions
#**********************************************************


分享到:
评论

相关推荐

    迭代重建算法.doc

    利用迭代重建法SIRT,用户可以通过扫描得到的数据或者读取有关的数据内容,输入到工具箱,然后通过工具箱的计算得到该事物的雏形。 图象重建工具箱的优势在于应用范围很广,无论医疗,建筑,工艺制造等等,...

    迭代软件开发项目管理

    本课程讲述迭代软件开发项目管理相关内容,适合希望对scrum有初步了解和概念的同学。

    算子迭代与自相似集 [许绍元 著] 2013年版

    《算子迭代与自相似集》不仅介绍算子迭代生成的迭代函数系统和自相似集的Hausdorff测度一般理论,而且还论述了近年来关于迭代函数系统和自相似集的Hausdorff测度的若干新理论与新方法,以及相关的公开问题。...

    MATLAB样例之雅克比迭代法

    有关MATLAB样例之雅克比迭代法方面的内容,里面包含matlab雅克比迭代发方面的祥细介绍及代码,编译可通过

    2023抖音旅游行业白皮书:复苏+迭代+重构-巨量引擎城市

    “旅行”相关内容发布人数占平台全行业 比重第二位。超 4 亿旅游兴趣用户在平台 观看旅游内容,用户对旅游内容的互动指 标也呈现增长,除此之外,中国居民出游意 愿有所提高,微度假、跨省游等热度持续。 同时,出...

    Python进阶之迭代器与迭代器切片教程

    本文是切片系列的第三篇,主要内容是迭代器切片。 迭代器是 Python 中独特的一种高级特性,而切片也是一种高级特性,两者相结合,会产生什么样的结果呢? 1、迭代与迭代器 首先,有几个基本概念要澄清:迭代、可迭代...

    C++STL实验报告-迭代器和非变异算法

    回顾以上四种容器相关的例题(不作为实验报告内容),例7.33作为实验报告内容。 二.练习课本第7章的例7.35、7.36,均作为实验报告内容。 三.练习第8章例8.1、8.3、8.6、8.9、8.10。8.3和8.10作为实验报告内容。

    《迭代方程与嵌入流》作 者: 张景中,杨路,张伟年 编 出版时间: 1998年

    书中大部分内容取材于作者近年来在这一领域的研究成果,含盖了一般迭代理论、迭代动力学、迭代根与嵌人流,丽且含盖了迭代方程解的存在性、唯一性、稳定性、光滑性、解折性、对称性及特征理论,《迭代方程与嵌入流》...

    代数迭代重建算法(中文).doc

    利用迭代重建法SIRT,用户可以通过扫描得到的数据或者读取有关的数据内容,输入到工具箱,然后通过工具箱的计算得到该事物的雏形。 图象重建工具箱的优势在于应用范围很广,无论医疗,建筑,工艺制造等等,都能用...

    迭代硬阈值压缩感知重构算法

    变换矩阵不相关的测量矩阵将变换域的高维信号投影到一个 低维空间上,然后通过求解一个优化问题就能从少量的投影 中以高概率或精确地重构出原信号!压缩感知理论的主要研 究内容包括信号的稀疏变换$测量矩阵设计和...

    牛顿拉普森迭代法程序

    此程序为 数字图像相关处理方面的内容,可以得出散斑图变化前后的位移和应变的结果,精确度还可以,也可以根据自身需要修改。

    论文研究-基于联合信源信道和迭代解码的LDPC编码方案.pdf

    首先,源节点借助一个中继节点向目的地节点发送相关内容,并在两个节点处应用分布式联合信源信道的LDPC编码;然后,基于矩阵运算在源节点处进行LDPC源编码,将LDPC信道编码应用于中继处,通过噪声信道将相应的码字...

    线性方程组的求解-列主元消元法,LU分解法,改进的平方根法,追赶法和雅可比迭代,高斯—塞德尔迭代

    在科技研究和工程技术所提出的计算问题中,经常会遇到线性方程组的求解问题,这里主要是有关线性方程组的直接解法。解线性方程组的直接法是用有限次运算求出线性方程组 Ax=b 的解的方法。线性方程组的直接法主要有...

    浅析python中的迭代与迭代对象

    在本文总小编给大家整理了关于python之中的迭代与迭代对象的相关基础知识点内容,需要的朋友们学习下。

    图像超分辨重建MATLAB源代码(迭代步长自适应)

    相关具体内容请参考对应的论文:Yingqian Wang, Jungang Yang, Chao Xiao, and Wei An, "Fast convergence strategy for multi-image superresolution via adaptive line search," IEEE Access, vol. 6, no. 1, pp. ...

    ES6中的迭代器、Generator函数及Generator函数的异步操作方法

    最近在写RN相关的东西,其中涉及到了redux-saga ,saga的实现原理就是ES6中的Generator函数,而Generator函数又和迭代器有着密不可分的关系。所以本篇博客先学习总结了iterator相关的东西,然后又介绍了Generator...

    Java中的迭代和递归详解

    主要给大家介绍了关于Java中的迭代和递归,文章显示分别介绍了Java中的迭代和递归,而后又介绍了迭代和递归的区别以及数形递归的相关内容,文中介绍的很详细,相信会对大家学习具有一定的参考借鉴价值,有需要的朋友...

    离散控制Matlab代码-markov-decision-process:值迭代算法介绍

    在下面查看有关如何计算效用的示例(有关更多详细信息,请参见-中的代码)算法: 策略迭代:在策略迭代中(霍华德1960),第一步执行一次,然后重复第二步直到收敛。 然后,再次执行第一步,依此类推。 对于大量可能...

    解决最小费用流问题的迭代算法matlab实现源码+项目说明+详细注释.zip

    2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为...

    论文研究-基于文本序列迭代模型的篇章语义理解 .pdf

    基于文本序列迭代模型的篇章语义理解,郑茂,张牧宇,本文关注在文本内容的基础上引入与文本相关的外部知识,辅助文本语义分析。在传统的文本挖掘研究中,更侧重于文本内容的分析而对

Global site tag (gtag.js) - Google Analytics