迭代器协议的 K 模式

chr*_*psn 5 apl k

我在Project Euler 问题的上下文中使用John Earnest 的 K 实现

许多问题涉及从无限级数(特别是素数)中获取前 n 项或所有项 <= n。它还可能涉及一次从预先存在的列表中取出项目,直到满足条件为止。

在 Python 中,一种方法是依赖迭代器协议:您可以从迭代器中取出直到它完成,或者在满足某些条件时提前中断(假设您已经取出了 n 项,或者您取出的最后一项满足了某个条件)健康)状况)。

K(或其他 APL)中用于实现类似目标的典型模式是什么 - 即,从列表或生成器中获取直到满足条件,而不评估或处理整个列表?我是否必须依赖以下技术,也许使用某种内部状态f?是否不鼓励这种方法,如果是这样,为什么?

  f/x      / fixed point
n f/x      / apply f n times
p f/x      / do or while loop, with p a predicate function (stops when 0)
Run Code Online (Sandbox Code Playgroud)

编辑 2018-10-14:此处有关 APL 中延迟迭代的一些有趣说明。

ego*_*or7 0

正如您所提到的(以及评论中所建议的):

p f/x      / do or while loop, with p a predicate function (stops when 0)
Run Code Online (Sandbox Code Playgroud)

事实上,您可以提供一个应用于每一步结果的谓词函数。只要谓词结果为 1b,迭代就会继续,否则停止。例如,一旦斐波那契数列超过 100,就停止计算:

{*|x<100} {x,+/-2#x}/1 1
Run Code Online (Sandbox Code Playgroud)