假设我有一个动词v
,例如,定义为v=.>:@*:
,我想应用v
一些初始值n
时间,并将所有中间结果存储在一个向量中,如下所示n=4
和初始值2
2 5 26 677 458330
我不知道如何在应用动词时"扩展"向量,即使我知道可以^:
用来执行应用程序n
时间.
请帮忙.
J有一个内置的操作员用于此操作和相关操作:( ^:
读取''power'').你正在寻找的特殊功能是它的右手参数是一个盒装数字(或数字):
v^:(<n) initial_value
Run Code Online (Sandbox Code Playgroud)
如在/:
>:@*:^:(<1+4) 2
2 5 26 677 458330
Run Code Online (Sandbox Code Playgroud)
为了使它成为一个可重用的动词(抽象结束n
和初始值):
vv =: >:@*:@]^:(<@>:@[)
4 vv 2
2 5 26 677 458330
Run Code Online (Sandbox Code Playgroud)
要使它成为可重复使用的副词(抽象n
,初始值,和v
):
V =: (@]) (^:(<@>:@[))
4 >:@*: V 2
2 5 26 677 458330
Run Code Online (Sandbox Code Playgroud)
请注意,^:
还有其他口味.例如,如果它的右手参数是一个未装箱的数字(或数字),它只是将该函数应用N次并产生最终值,而不是建立一个中间值的向量.
或者,如果它的右手参数是无限的,它会将函数应用于其固定点.或者,结合这两个观察,如果它的右手参数被加框并且是无限的,它将函数应用于其固定点,沿途构建中间值的向量.还有很多其他巧妙的技巧.
PS:使用as中>:
的函数编写函数将正确生成输入平方加1. *:
@
>:@*:
但是,由于@
定义为像装配线一样,将每个输出单独传递*:
给>:
后者,后一个动词(增量)将被调用#y
次数.使用@:
("atop")代替@
("at")可以更有效地获得相同的结果.
作为一个组合操作员,@:
它更像是一个料斗而不是一条装配线:它*:
完全等待完成加工,将所有结果收集起来,并>:
一次性传递给它们.
鉴于J的数组导向性质,经验法则是"思考大".也就是说,让每个原语看到尽可能多的数据,并让解释器管理细节.当你学习J时,可能值得采用"使用@:而不是@"作为一揽子规则,直到你掌握了细微差别.