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