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

Dic*_*ick 4 j

假设我有一个动词v,例如,定义为v=.>:@*:,我想应用v一些初始值n时间,并将所有中间结果存储在一个向量中,如下所示n=4和初始值2

2 5 26 677 458330

我不知道如何在应用动词时"扩展"向量,即使我知道可以^:用来执行应用程序n时间.

请帮忙.

Dan*_*ron 7

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时,可能值得采用"使用@:而不是@"作为一揽子规则,直到你掌握了细微差别.