我刚开始学习J,我试图创建一个检查数字是否为素数的函数。
<./<./13|*/~(2}.i.)13
检查13是否为素数并返回1.
<./<./10|*/~(2}.i.)10
这将返回0.
所以我的问题是:我如何制作一个功能呢?如何指定参数?
prime(x) =: <./<./x|*/~(2}.i.)x
这当然不会奏效。但是如何在J?
中创建此功能PS。我知道这个函数不能用于2,我稍后会处理它:D
答案 0 :(得分:6)
为了用命名参数替换那些句子中的特定值,您可以使用脚本,如下所示:
prime=: verb :'<./<./y|*/~(2}.i.)y'
prime 13
1
prime 10
0
(这里'动词'这个词只是3.它作为冒号的左参数,而脚本体是冒号的右参数。但是可以随意忽略该细节,并视为一种模式'动词:'在引用的剧本主体之前。)
你会注意到我使用y而不是x作为参数名称。在显式J形式中,左参数是x(当有一个时)和右参数y。
动词接收不定形状的数组在J中很自然,但如果给出除标量之外的任何内容,则上面定义的数组会出错。这是一种解决方法:
prime=: (verb :'<./<./y|*/~(2}.i.)y')"0
prime 10 11 12 13
0 1 0 1
作为一个风格问题,&lt; ./(至少之间)的重复可能无法传达您的意图以及:
prime=: (verb :'<./ , y|*/~(2}.i.)y')"0
我想提一下,虽然像这样的程序非常适合探索这种语言,但是数字是否为素数是由J主要处理的。通常会使用该符号p:
。如果需要指定的名称,并选择显式格式,这是一个典型的定义:
prime=: verb :'1 p: y'
和以前一样,'y'将被解释为命名动词(“prime”)的右参数的值。
总结:要指定参数,代替特定值,使用显式形式。这涉及一个脚本,即文本。在显式动词中,分别将'x'和'y'分别写为左右参数。如果你只使用一个参数,那就是'y'。
J程序员经常使用默认形式。在默认形式中没有脚本,并且始终隐含参数,未指定。 (当更加舒适时,以明确的形式工作没有问题。)“显式”是这样称呼的,因为在该形式中,参数是明确指出的。