重复动词应用程序并将结果存储在向量中

时间:2013-10-05 17:28:35

标签: j

假设我有一个动词v,例如,定义为v=.>:@*:,我希望将v应用于某些初始值n次,并存储所有中间结果在向量中,如n=4的以下内容和初始值2

2 5 26 677 458330

我不确定在应用动词时如何“扩展”向量,即使我知道可以使用^:来执行应用n次。

请帮忙。

2 个答案:

答案 0 :(得分:7)

J有一个内置的运算符用于此操作和相关操作:^:(读取''power'')。你正在寻找的特定种类的权力是它的右手参数是一个盒装数字(或数字):

   v^:(<n) initial_value

   >:@*:^:(<1+4) 2
2 5 26 677 458330

要使其成为可重复使用的动词(对n的抽象和初始值):

   vv =: >:@*:@]^:(<@>:@[)
   4 vv 2
2 5 26 677 458330

要使其成为可重复使用的副词(抽象超过n,初始值和v):

   V =: (@]) (^:(<@>:@[))
   4 >:@*: V 2
2 5 26 677 458330

请注意^:也有其他风格。例如,如果它的右手参数是一个未装箱的数字(或数字),它只是将该函数应用N次并产生最终值,而不是建立一个中间值的向量。

或者,如果它的右手参数是无限的,它会将函数应用于其固定点。或者,结合这两个观察,如果它的右手参数被加框并且是无限的,它将函数应用于其固定点,沿途构建中间值的向量。还有很多其他巧妙的技巧。


PS:使用>:使用*:函数编写函数@,如>:@*:中所示,将正确生成输入平方加1。

但是,由于@被定义为像装配线一样,将*:的每个输出单独传递给>:,因此将调用后一个动词(增量){{1} }次。使用#y(“atop”)代替@:(“at”),您可以更有效地获得相同的结果。

作为一个作曲操作员,@更像是一个漏斗而不是装配线:它完全等待@:完成处理,将所有结果收集在一起,并将它们传递给*:一气呵成。

鉴于J的数组导向性质,经验法则是“思考大”。也就是说,让每个原语看到尽可能多的数据,并让解释器管理细节。当你学习J时,可能值得采用“使用@:而不是@”作为一揽子规则,直到你掌握了细微差别。

答案 1 :(得分:2)

我通常为此做的是将v应用于列表的尾部(或头部)并将结果追加到列表中:

v1 =: 3 :'y , v {: y'

v1 1
1 2

v1 1 2
1 2 5

(v1^:5) 1
1 2 5 26 677 458330

您可以使用多种变体,具体取决于所需的效率,数据结构等。