Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 将迭代计算转换为迭代器——什么';这叫什么?_Loops_Iterator_Generator_Lazy Evaluation_Code Conversion - Fatal编程技术网

Loops 将迭代计算转换为迭代器——什么';这叫什么?

Loops 将迭代计算转换为迭代器——什么';这叫什么?,loops,iterator,generator,lazy-evaluation,code-conversion,Loops,Iterator,Generator,Lazy Evaluation,Code Conversion,这一定是一个常见的代码转换,所以我很惊讶,我无法轻松找到它的名称,也无法找到如何最好地进行转换的信息 原始代码(伪): 是的,它通常被称为“惰性评估”(设计模式),但这种特定的、基本的代码转换类型不是被称为更具体的东西吗?我还查阅了“迭代器”和“工厂”设计模式,以及“循环展开”,但没有什么概念适合我所说的。有什么想法吗?我错过了什么?感谢您的指导 更新 答案是“生成器”,如下所示。至于代码的“转换”,上面的核心变化是a[n]=-->yield,当然,使用任何语法定义生成器而不是子例程。但是,如果

这一定是一个常见的代码转换,所以我很惊讶,我无法轻松找到它的名称,也无法找到如何最好地进行转换的信息

原始代码(伪):

是的,它通常被称为“惰性评估”(设计模式),但这种特定的、基本的代码转换类型不是被称为更具体的东西吗?我还查阅了“迭代器”和“工厂”设计模式,以及“循环展开”,但没有什么概念适合我所说的。有什么想法吗?我错过了什么?感谢您的指导

更新

答案是“生成器”,如下所示。至于代码的“转换”,上面的核心变化是
a[n]=
-->yield,当然,使用任何语法定义生成器而不是子例程。但是,如果您的语言不支持这个想法,或者您不想使用第三方软件包来实现它,也可以“手动”实现这个想法(至少在这个简单的情况下),方法是“取消测试”所有循环:

sub array_next {
  if (++k >= p[i][j])
    k = 0;
    if (++j >= Y)
      j = 0;
      if (++i >= X)
        return false
  return calculation(i,j,k,p)
}

sub array_start {
  i = j = k = 0;
}

注意一个需要正确处理的差异:变量(
i
j
k
)已经成为全局变量,或者至少是公开变量。

这里所做的不完全是延迟求值,因为它通常指的是对某个表达式的延迟求值,这在函数式编程中很常见。摘自维基百科关于:

[…]惰性评估或按需调用是一种评估策略 延迟表达式的计算,直到需要其值[…]

您在这里构建的内容非常适合术语生成器。摘自维基百科关于:

[…]生成器是一种特殊的例程,可用于控制 循环的迭代行为。事实上,所有的发电机都是 迭代器。生成器非常类似于返回的函数 可以调用一个数组,其中生成器具有参数,并且 生成一系列值。但是,不是构建阵列 包含所有值并同时返回它们的生成器 一次生成一个值,这需要更少的内存并允许 调用方立即开始处理前几个值


如果生成的序列是无限的,则生成器通常被称为。但是,术语流也用于按需计算的有限序列。

枚举器?我认为(可能是错误的)MoveNext、MovePrev、Start、End属于枚举器样式/名称…谢谢。到目前为止,我只发现“enumerator”被描述为“iterator”的一个实现接口,并且总是绑定到现有的可枚举集合(而不是延迟计算的值),但可能还有更多…myeah这里没有真正的术语。。。你基本上只是在一个数组中循环,然后检查一个条件。。。没有什么特别或具体的。我以为你指的是你循环的方式(移动下一步而不是For循环)。。。对不起,我帮不了你更多;很抱歉,上面的func名称可能混淆了--转换后的实现中没有这样的“数组”。我们的想法是不计算任何这样的数组,只计算它的元素一个接一个(这样可以避免对可能永远不会使用的值进行昂贵的计算)。。。如果你知道那个词是什么,让我知道……是的,就是这个!作为一个纯粹主义者(以及为了我自己的教育和效率控制),我将在上面的代码中为自己实现这个概念,通过取消所有循环,而不是找到一个给我提供
收益
能力的包。但是很高兴知道,这个设计需求以前已经被识别、命名和解决了!
sub array_start() {...}
sub array_next() {... return val}

array_start();
while (m = array_next())
  if some_cond(m) break;
  work_with(m);
sub array_next {
  if (++k >= p[i][j])
    k = 0;
    if (++j >= Y)
      j = 0;
      if (++i >= X)
        return false
  return calculation(i,j,k,p)
}

sub array_start {
  i = j = k = 0;
}