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

时间:2015-05-30 06:08:25

标签: j

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

(, [: +/ _2&{.)^:20 i.2

当Fibonaccis达到某个极限时,我怎么能停下来,比如说1e6? (我知道如何使用while.在函数内执行此操作,但这并不好玩。)

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

2 个答案:

答案 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