想象一下,您使用明显的强力算法生成斐波纳契数.如果我知道我想提前生成的Fibonaccis的数量,我可以使用功率连接做这样的事情^:
:
(, [: +/ _2&{.)^:20 i.2
Run Code Online (Sandbox Code Playgroud)
当Fibonaccis达到某个极限时,我怎么能停下来1e6
呢?(我知道如何在函数内部使用while.
,但这没什么好玩的.)
我想强调这是关于J的一般性问题,而不是关于斐波那契的具体问题.斐波那契数字不要太过分心.问题的核心是如何在满足某些条件之前继续追加到列表中.
Power还有动词形式u^:v^:n
,其中第二个动词可用作检查.例如:double(+:
)while(n
is _
)小于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)
我认为最好的答案是 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