3

我刚开始学习 J,并尝试创建一个检查数字是否为素数的函数。

<./<./13|*/~(2}.i.)13

这将检查 13 是否为素数并将返回 1。

<./<./10|*/~(2}.i.)10

这将返回 0。

所以我的问题是:我如何从中创建一个函数?如何指定参数?

prime(x) =: <./<./x|*/~(2}.i.)x

这当然行不通。但是我怎样才能在 J 中创建这个函数呢?

PS。我知道该功能不适用于 2,我稍后会处理:D

4

1 回答 1

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

作为文体问题, <./ 的重复(最少)可能无法传达您的意图以及以下内容:

   prime=: (verb :'<./ , y|*/~(2}.i.)y')"0

我想提一下,虽然像这样的程序非常适合探索语言,但判断一个数字是否为素数是由 J 初级处理的。p:通常会使用该符号。如果需要指定的名称,并选择明确的形式,这是一个典型的定义:

   prime=: verb :'1 p: y'

和以前一样,'y' 将被解释为命名动词(“prime”)的右参数的值。

总结:要指定参数,而不是特定值,使用显式形式。这涉及一个脚本,即文本。在显式动词中,将“x”和“y”分别写为左右参数。如果你只使用一个参数,它是'y'。

J 程序员经常使用默认形式来代替。在默认形式中,没有脚本,并且参数总是隐含的,而不是指定的。(当它更舒服时,以显式形式工作没有问题。)之所以称为“显式”,是因为在这种形式下,参数是显式指示的。

于 2010-11-22T11:43:57.290 回答