5

在 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)

编辑 2018-10-14:关于 APL 中惰性迭代的一些有趣的注释。

4

1 回答 1

0

正如您所提到的(并在评论中建议):

p f/x      / do or while loop, with p a predicate function (stops when 0)

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

{*|x<100} {x,+/-2#x}/1 1
于 2019-11-20T10:17:12.860 回答