我有一个二进位函数,称其为f
,它使用一个数字和一个数组,并输出另一个数组。例如:
0 f x_0
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
其中x_0 =: 1+i.30
。
我想运行任意次,但是将计算的数组结果馈送到f
的下一个调用中。例如,对于3(输出数组似乎是任意的,但这是正确的):
3 f 2 f 1 f 0 f x_0
2 8 6 9 4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
我想使用x g y
形式的函数,其中x
是一个数字,y
是起始数组,它将使用g
作为初始数组,应用x
y
次。输入。
我已经尝试为此使用后缀\.
,但是我很难确定如何将x_0
作为初始列表传递给f
。我不仅需要执行2 f 1 f 0 f
。似乎我需要一个带数字的函数,然后将多个函数链接在一起,同时将&
整数参数设置为f
。但是,这失败了。例如:
f2 =: 3 & f 2 & f 1 & f 0 & f
f2 x_0
|index error: g1
| f2 x_0
这似乎已经结束,但是我认为我对&
的工作方式有误解(g1
是我可以在必要时共享的内部函数)。我想我想要类似的内容:f(2, f(1, f(0, y)))
,而y
是我的初始列表,但我不想显式调用f
。
我戳了一下,在作曲上取得了更多进步:
f2 =: (2 & f) @ (1 & f) @ (0 & f)
f2 x_0
4 6 2 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
这有效,但是我对如何组成任意数量的函数有些迷惑。如何将f
任意组合,同时将其左参数绑定到递减数字数组的各个元素上?我觉得有一种更“本能”的J方法可以做到这一点,但到目前为止,我在文档中什么都找不到。
谢谢,如果您需要更多信息,请告诉我。
整洁的问题,这是我处理问题的方式,但是当您使用J时,您会发现可能还有其他方法。
我的解决方法是:
g=. 4 : '> (f~&.>)/ (<y),(<"[email protected])'
f=. + NB. + is placeholder for whatever f is
a_0 =. 3
b_0 =. 1 + i. 10
a_0 g b_0
4 5 6 7 8 9 10 11 12 13
分解步骤:
(<b_0),(<"0 i.a_0) NB. append boxed integers of i. a_0 to boxed b_0
┌────────────────────┬─┬─┬─┐
│1 2 3 4 5 6 7 8 9 10 │0│1│2│
└────────────────────┴─┴─┴─┘
(f~&.>)/ (<b_0),(<"0 i.a_0) NB. arguments of f are reversed and unboxed, f operates and then boxes result and moves to next item
┌───────────────────────┐
│4 5 6 7 8 9 10 11 12 13 │
└───────────────────────┘
> (f~&.>)/ (<b_0),(<"0 i.a_0) NB. result is unboxed
4 5 6 7 8 9 10 11 12 13
以默认形式g看起来像这样:
gt=. >@:(f~ &.>) / @:((<@]) , |.@:<"0@i.@[)
a_0 gt b_0
4 5 6 7 8 9 10 11 12 13