1

我想为学习 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

4

2 回答 2

1

您可以使用定义一个动词: 3

f =: 3 :'=&0+/(=&0)(2+i.(-&2)y)|y'
f 5
1
f 13
1
f 10
0

使用时: 3y总是指动词的右手自变量。

如果要定义二元动词,请使用: 4andx作为左参数。

顺便说一句,您可以在任何地方设置变量的值:

   =&0+/(=&0)(2+i.(-&2)y)|y=.5
   1
   =&0+/(=&0)(2+i.(-&2)y)|y=.10
   0
于 2012-08-16T07:44:16.473 回答
1

您可能会发现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
于 2012-08-16T10:34:20.577 回答