2

还在J的学习过程中……现在要解决的问题是表示和的平方减去自然整数的平方和

天真的解决方案是

(*:+/>:i.100) - (+/*:>:i.100)

现在,我想使用一个 fork 来>:i.100只写一次列表。我的叉子应该:

  h
/   \
f   g
|   |
x   x

其中fg和的平方, 是平方和,h是负数。于是,我天真地写道:

((*:+/) - (+/*:)) >:i.100

但它给了我一个域错误。为什么?我也试过:

(+/ (*: - +/) :*) >: i.100

而这一次,它给了我一长串数字......我猜它与@连词有关,但我仍然不知道 At 是做什么的......继续我的探索,我终于得到了

((+/*+/) - +/@:*:) >:i.100

但我不喜欢我手动计算平方而不是使用*:运算符这一事实,而且我真的不明白为什么我需要合@:取。有人可以告诉我这个问题吗?

4

1 回答 1

3

(+/*:)(*:+/)不要做你认为他们做的事。

实际上,您的fQ (S x)(x 的平方和)和您的gS (Q x)(x 的平方和)。您可以看到对于任何 f,g 它是f (g y)= (f @: g) y

所以,你可以写

(Q (S x)) h (S (Q x))

作为

((Q @: S) x) h ((S @: Q) X)

现在相当于_

(f x) h (g x)

或者

(f h g) x

因此,

((*: @: (+/)) - (+/ @: *:)) >: i.1000

另请注意,*: @: (+/)这与 不同*: @: +/,因为+/不是一个动词(like *:),而是一个动词 ( +) 和一个副词 ( /) 的复合动词。

于 2013-03-01T15:37:48.483 回答