想象一下,您使用明显的强力算法生成斐波纳契数。如果我知道我想提前生成的Fibonaccis的数量,我可以使用幂联合^:
来做这样的事情:
(, [: +/ _2&{.)^:20 i.2
当Fibonaccis达到某个极限时,我怎么能停下来,比如说1e6
? (我知道如何使用while.
在函数内执行此操作,但这并不好玩。)
我想强调这是关于J的一般性问题,而不是关于斐波纳契的具体问题。不要被斐波那契数字分散注意力。问题的核心是如何在满足某些条件之前继续追加到列表中。
答案 0 :(得分:8)
电源也有a verb form u^:v^:n
,其中第二个动词可用作支票。例如:double(+:
)while(n
_
)小于100(100&>
):
+:^:(100&>)^:_ ] 1
128
+:^:(100&>)^:_ ] 3
192
像往常一样,为了追加权力的结果,你将名词包括在内:
+:^:(100&>)^:(<_) ] 3
3 6 12 24 48 96 192
答案 1 :(得分:4)
我认为对此最好的答案是亨利里奇的书籍J for C程序员。具体来说,它使用Power Conjunction if(!m_file->open(QIODevice::WriteOnly))
{
qDebug() << tr("Error opening save file");
abort();
}
。您也可以使用它来收敛,直到没有变化,因此不需要定义限制。亨利使用的例子是:
^:
2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11)
128 192 160 112 144 176
Power Conjunction重复,直到没有变化且结果的^:_
测试小于100.如果是,那么^:(100&>@:])
将应用于^:
并且循环1
再次完成,如果它不小于100,那么2*
将应用于^:
,这导致它什么也不做,没有任何改变,循环退出。它使用0
作为排名这一事实意味着它可以将加倍函数"0
分别应用于每个2*
。
亨利确实比我更好地解释了这个过程,所以这里是进一步阅读的参考。 http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389