`
tjcjc
  • 浏览: 22062 次
  • 性别: 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
#**********************************************************


分享到:
评论

相关推荐

    jor_dor_jor_迭代法_JOR迭代_JOR迭代法_源码

    在压缩包中的"p74 3.7 jor"文件很可能包含了JOR迭代法的详细解释、算法实现或者相关案例分析。"read me.txt"文件通常用来提供关于压缩包内容的说明,包括如何使用这些文件以及可能的注意事项。为了深入理解JOR迭代法...

    雅可比迭代法和高斯-塞德尔迭代法

    根据提供的实验报告内容,我们可以详细地探讨雅可比迭代法(Jacobi Iteration Method)、高斯-塞德尔迭代法(Gauss-Seidel Iteration Method)以及不动点迭代法(Fixed Point Iteration Method)的相关知识点。 ### 一、...

    迭代方程与嵌入流

    迭代方程和嵌入流是数学中两个密切相关且广泛应用于多个领域的概念,它们各自的研究对理解复杂系统的动态性质具有重要的意义。迭代方程关注的是通过重复应用相同的操作或运算,以研究序列的生成及其极限行为,而嵌入...

    计算方法导引_牛顿迭代法_雅可比迭代算法_

    在计算机科学和数值分析领域,...通过阅读和理解这些内容,读者可以掌握利用牛顿迭代法和雅可比迭代算法解决实际问题的能力。在实际应用中,这些方法往往需要与数值稳定性和误差分析相结合,以确保求解的准确性和效率。

    迭代法开n次方计算器

    在提供的压缩包文件"迭代法开n次方"中,可能包含了实现这些迭代算法的源代码或相关资源,用户可以通过这些代码了解并学习如何运用迭代法来计算任意数的n次方根。学习这部分内容不仅可以加深对迭代法的理解,还能提升...

    Matlab_迭代法

    1. 根据迭代收敛性的充分必要条件来判断 Jacobi 迭代式与 Gauss-Seidel 迭代式的收敛性,迭代收敛性仅与方程组系数矩阵有关,与右端无关;而且不依赖于初值的选取。 2. 根据矩阵的判断定理求得矩阵元素 a 的取值,...

    利用雅克比迭代求解矩阵的解

    本文档将深入探讨雅克比迭代法的理论基础和算法实现步骤,同时将参考西安交通大学版的数值分析课程的相关内容。 首先,雅克比迭代法的基本原理是从一组初始估计解出发,通过迭代计算不断逼近真实解的方法。在每次...

    struts2迭代 Map List

    结合使用`s:if`和`s:else`标签,可以在迭代过程中添加条件判断,根据不同的条件渲染不同的内容。 通过以上这些方法,Struts2的`&lt;s:iterator&gt;`标签能够灵活地处理Map和List数据,大大简化了JSP页面的数据展示逻辑。...

    迭代测试的谬论与事实

    在软件开发领域,迭代测试和迭代开发是两个密切相关的概念。但是,人们对这两个概念的理解存在很多误解和谬论。这篇文章旨在揭穿这些谬论,并解释迭代开发原则是如何解决这些通常的误解的。 谬论一:在多数的软件...

    迭代算法求信道容量

    根据给定的信息,本文将对“迭代算法求信道容量”的相关知识点进行详细的解析与讨论。主要内容包括: 1. **信道容量的概念** 2. **迭代算法的基本原理** 3. **C语言实现中的具体步骤** 4. **MATLAB实现概述** ### ...

    yakebi.rar_迭代精度_高斯迭代

    总的来说,"yakebi.rar_迭代精度_高斯迭代"这个压缩包文件很可能包含了关于如何实现这两种迭代法的代码示例或教程,以及如何根据误差和精度控制迭代次数的相关资料。通过学习这些内容,你可以深入了解这两种迭代法的...

    迭代的保留有信息变量

    贡献度通常通过某种评估指标来衡量,如方差解释率、互信息或相关系数等。在每一轮迭代后,那些贡献最小的变量会被剔除,保留下来的变量被认为能更好地保留原始数据的信息。 具体实施时,IRIV的步骤如下: 1. **...

    牛顿迭代法,多项式求解。

    牛顿迭代法是一种在数学和计算领域广泛应用的数值方法,用于寻找函数的零点,即...如果你对如何使用这个“test”文件有疑问,或者需要更深入地了解牛顿迭代法在实际问题中的应用,建议参考相关的编程教程或数学教材。

    离散信道容量迭代算法C++程序

    程序可能包含了头文件、源文件、主函数、类定义以及相关的辅助函数,每个部分都有其特定的功能。 10. **版本控制**:在开发过程中,使用版本控制系统(如Git)可以跟踪代码的变更历史,便于团队协作和错误修复。 ...

    产品迭代开发流程图

    - **版本封存备份**: 版本封存备份是指在每次迭代结束后,对当前版本的源代码和相关文档进行归档保存,以便将来查询或恢复。 - **外部/内部质量控制**: 如前所述,外部质量控制由第三方进行,而内部质量控制则由项目...

    迭代学习控制.pdf

    在该文档中,内容从线性系统的迭代学习控制展开,提出了多种迭代学习律,包括D型学习律和PID型学习律。D型学习律主要基于系统输出与参考轨迹之间的差异来调整控制输入,而PID型学习律则进一步引入比例、积分和微分三...

    算法和数据结构——迭代和递推(上).pdf

    结合以上信息,文档内容可能旨在向读者展示如何通过迭代和递推技术解决数学问题,并通过编程实现具体的算法。文档提供了算法的理论基础、具体的实现方法和相应的示例,是学习算法和数据结构的宝贵资源。

    函数方程和函数迭代问题.pdf

    例如,文件中出现的函数形式如“f(x+1)=f[f(x)]+3”,表示函数f的迭代关系,这与函数方程的概念紧密相关。 接着,我们可以看到文件内容涉及了函数迭代的概念,即对同一个函数重复应用,以得到一系列的函数值。文件...

    LMSandKalman.rar_LMS学习曲线_LMS迭代_lms 学习曲线_迭代学习_迭代次数

    标题中的“LMSandKalman.rar”是一个压缩文件,它包含有关线性最小均方误差(LMS)算法的学习曲线和迭代过程的信息。LMS算法是信号处理和控制理论中的一种自适应滤波器,主要用于在线估计和更新系统参数。在机器学习...

Global site tag (gtag.js) - Google Analytics