这是一个天真的斐波那契序列:
(,[:+/_2&{.)^:10]0 1 NB. 10 + 2 elements
0 1 1 2 3 5 8 13 21 34 55 89
这是明确的monadic版本:
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中默认定义副词和连词,或者只能使用明确的定义?
我的直觉(以及来自this问题的材料)告诉我,我应该走到黑暗的一边,详细了解动名词和`
/ `:
连词。那是对的吗?如果是这样,我会很感激任何有关此问题的新手友好材料:)
答案 0 :(得分: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
并创建一个寻找迭代次数的monadic动词。
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