我想写素数函数来学习J。到目前为止,我已经想出了这个:
=&0+/(=&0)(2+i.(-&2)y)|y
它工作得很好,除了我应该将数字存储在变量中y
。
y=.5
=&0+/(=&0)(2+i.(-&2)y)|y NB. prime cheker
1
y=.13
=&0+/(=&0)(2+i.(-&2)y)|y NB. prime cheker
1
y=.14
=&0+/(=&0)(2+i.(-&2)y)|y NB. prime cheker
0
我如何编写一个函数来工作,即 f 13
-> 1
您可以使用
: 3
定义动词。
f =: 3 :'=&0+/(=&0)(2+i.(-&2)y)|y'
f 5
1
f 13
1
f 10
0
当使用: 3
时,y
总是指动词的右手参数。
如果要定义二元动词,请使用 : 4
和 x
作为左参数。
顺便说一句,您可以在任何地方设置变量的值:
=&0+/(=&0)(2+i.(-&2)y)|y=.5
1
=&0+/(=&0)(2+i.(-&2)y)|y=.10
0
您可能会发现 J Wiki 上的定义动词指南很有用。
如前所述,您可以使用以下语法将句子定义为动词:
isPrime0=: 3 : '=&0+/(=&0)(2+i.(-&2)y)|y'
但是,这样写可能更自然:
isPrime1=: 3 : '0 = (+/ 0 = (2 + i. y - 2) | y)'
您还可以定义一个隐式版本(不引用参数),如下所示:
isPrime2=: 0 = [: +/ 0 = ] |~ 2 + [: i. 2 -~ ]
isPrime3=: 0 = [: +/ 0 = ] |~ 2 + i.@:-&2 NB. replace train with verb composed using conjunctions
isPrime4=: 0 = [: +/ 0 = ] |~ i.&.(-&2) NB. use Under to re-add the 2 after Integers
isPrime5=: 0 -.@e. i.&.(-&2) | ] NB. check no zero in result