假设我有一个动词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时,可能值得采用"使用@:而不是@"作为一揽子规则,直到你掌握了细微差别.
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |