当在J中绑定其自变量的一侧时,如何任意组合二进位函数?

问题描述 投票:3回答:1

我有一个二进位函数,称其为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
1个回答
3
投票

整洁的问题,这是我处理问题的方式,但是当您使用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
© www.soinside.com 2019 - 2024. All rights reserved.