3

这是一个简单的斐波那契数列:

   (,[:+/_2&{.)^:10]0 1      NB. 10 + 2 elements
0 1 1 2 3 5 8 13 21 34 55 89

这是它的显式一元版本:

   3 :'(,[:+/_2&{.)^:y 0 1' 10
0 1 1 2 3 5 8 13 21 34 55 89

问题是:在默认定义中,我能否以某种方式提供最右边的论点来^:连接,例如(在我脑海中):

   ((,[:+/_2&{.)^:y 0 1)10
0 1 1 2 3 5 8 13 21 34 55 89

会产生预期的结果吗?或者,更正确的定义(再次,在我的脑海中):

   ((,[:+/_2&{.)^:(y-2)1 1)10
1 1 2 3 5 8 13 21 34 55

更一般地说:是否可以在 J 中默认地定义副词和连词,或者是否只有明确的定义才有可能?

我的直觉(以及这个问题的材料)告诉我,我应该去黑暗的一面,了解更多关于动名词和`/`:连词的知识。那是对的吗?如果是这样,我将不胜感激任何关于这个问题的新手友好材料:)

4

1 回答 1

2

我认为我的自然方法是创建一个二元动词,其中左参数是迭代次数,右参数是初始字符串。这使我可以轻松地扩展字符串。

fib0=: (,[:+/_2&{.)@]^:[ 
   10 fib0 0 1
0 1 1 2 3 5 8 13 21 34 55 89
   11 fib0 0 1
0 1 1 2 3 5 8 13 21 34 55 89 144

(,[:+/_2&{.)我可以通过填写作为左参数^:和作为左参数来创建一个动词10。虽然在扩展字符串方面不太灵活。

  fib1=: (,[:+/_2&{.)^: 10
   fib1 0 1
0 1 1 2 3 5 8 13 21 34 55 89

0 1我最终通过附加定义并创建一个单子动词来查找迭代次数来伪造您可能正在寻找的结果。

  fib2=: ((,[:+/_2&{.)@](^: [))& 0 1
   fib2 10
0 1 1 2 3 5 8 13 21 34 55 89
   fib2 11
0 1 1 2 3 5 8 13 21 34 55 89 144

但是您想知道是否有一种方法可以默认使用副词来做到这一点。采取我上面显示的内容,您可以通过在左侧^:添加动词来从连词创建副词。(,[:+/_2&{.)

   afib=: (,[:+/_2&{.) ^: 
   (10 afib)                 NB. an adverb takes its left argument creating a conjunction.
(, ([: +/ _2&{.))^:10
   (10 afib) 0 1
0 1 1 2 3 5 8 13 21 34 55 89
   (11 afib) 0 1
0 1 1 2 3 5 8 13 21 34 55 89 144
于 2018-03-28T23:36:47.200 回答