假设我有一个动词v
,例如,定义为v=.>:@*:
,我希望将v
应用于某些初始值n
次,并存储所有中间结果在向量中,如n=4
的以下内容和初始值2
2 5 26 677 458330
我不确定在应用动词时如何“扩展”向量,即使我知道可以使用^:
来执行应用n
次。
请帮忙。
答案 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
您可以使用多种变体,具体取决于所需的效率,数据结构等。