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