在满足某个条件之前,是否有添加到列表的J语言?

Gre*_*ley 5 j

想象一下,您使用明显的强力算法生成斐波纳契数.如果我知道我想提前生成的Fibonaccis的数量,我可以使用功率连接做这样的事情^::

(, [: +/ _2&{.)^:20 i.2
Run Code Online (Sandbox Code Playgroud)

当Fibonaccis达到某个极限时,我怎么能停下来1e6呢?(我知道如何在函数内部使用while.,但这没什么好玩的.)

我想强调这是关于J的一般性问题,而不是关于斐波那契的具体问题.斐波那契数字不要太过分心.问题的核心是如何在满足某些条件之前继续追加到列表中.

Eel*_*vex 8

Power还有动词形式u^:v^:n,其中第二个动词可用作检查.例如:double(+:)while(nis _)小于100(100&>):

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

+:^:(100&>)^:_ ] 3
192
Run Code Online (Sandbox Code Playgroud)

像往常一样,为了附加权力的结果,你将名词包括在内:

+:^:(100&>)^:(<_) ] 3 
3 6 12 24 48 96 192
Run Code Online (Sandbox Code Playgroud)


bob*_*bob 4

我认为最好的答案是 Henry Rich 的《J for C 程序员》一书。具体来说,它使用电源连接^:。你也可以用它来收敛,直到没有变化,这样就不需要定义极限了。亨利举了一个例子:

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

重复幂^:_连接,直到没有变化并且^:(100&>@:]) 测试结果小于 100。如果它被^:应用1,然后再次进行循环 2*,如果它不小于 100,那么^:将被应用0,结果是它什么都不做,也没有任何改变,循环退出。"0它用作排名的事实意味着它可以将加倍函数单独应用于2*每个1 3 5 7 9 11

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