是否有 J 成语用于添加到列表直到满足特定条件?

Is there a J idiom for adding to a list until a certain condition is met?

假设您正在使用显而易见的强力算法生成斐波那契数列。如果我事先知道我想要生成的斐波那契数,我可以使用幂连词 ^::

来做这样的事情
(, [: +/ _2&{.)^:20 i.2

我怎样才能在斐波那契达到某个极限时停止,比如说 1e6? (我知道如何使用 while. 在函数内部执行此操作,但这并不好玩。)

我想强调一下,这是一个关于 J 的一般问题,而不是一个关于斐波那契的特定问题。不要被斐波那契数字分心。问题的核心是如何在满足某些条件之前一直追加到列表中。

Power 也有 a verb form u^:v^:n,其中第二个动词可以用作检查。例如:double (+:) while (n is _) 小于 100 (100&>):

+:^:(100&>)^:_ ] 1
128

+:^:(100&>)^:_ ] 3
192

像往常一样,要附加到幂的结果,您将名词框起来:

+:^:(100&>)^:(<_) ] 3 
3 6 12 24 48 96 192

我认为最好的答案是 Henry Rich 的 J for C programmers 一书。具体来说,它使用幂连词 ^: 。您也可以使用它来收敛直到没有变化,这样就不需要定义极限了。亨利使用的例子是:

2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11)
128 192 160 112 144 176

^:_ Power Conjunction 重复直到没有变化,^:(100&>@:]) 测试结果是否小于 100。如果是,则 ^: 应用于 1 并且循环 2* 再次完成,如果它不小于 100 那么 ^: 将应用于 0 并且导致它什么都不做并且没有任何变化并且循环退出.它使用 "0 作为等级的事实意味着它可以将加倍函数 2* 单独应用于每个 1 3 5 7 9 11

Henry 确实比我解释得更好,所以这里是进一步阅读的参考。 http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389