While loop J:为什么'f^:命题^:uy'代表一段时间的循环?

While loop J:为什么'f^:命题^:uy'代表一段时间的循环?,while-loop,j,While Loop,J,正如标题所说,我不明白为什么f^:proposition^:y是一个while循环。实际上我已经用过几次了,但我不明白它是如何工作的。我知道,^:重复函数,但我对它在该语句中的双重使用感到困惑 我也不明白为什么f^:proposition^:a:y有效。这与前一个相同,但返回所有迭代中的值,而不是像上面那样只返回最后一个迭代 a:是一个空框,我得到了一个与^:一起使用的特殊含义,但即使查过字典,我也无法理解它 谢谢。f^:proposition^:不是while循环。当命题返回1或0时,这(几乎

正如标题所说,我不明白为什么
f^:proposition^:y
是一个while循环。实际上我已经用过几次了,但我不明白它是如何工作的。我知道,
^:
重复函数,但我对它在该语句中的双重使用感到困惑

我也不明白为什么
f^:proposition^:a:y
有效。这与前一个相同,但返回所有迭代中的值,而不是像上面那样只返回最后一个迭代

a:
是一个空框,我得到了一个与
^:
一起使用的特殊含义,但即使查过字典,我也无法理解它


谢谢。

f^:proposition^:
不是while循环。当
命题
返回
1
0
时,这(几乎)是一个while循环。当
命题
返回其他结果时,这是一种奇怪的while循环

让我们看一个简单的一元格

f =: +:        NB. Double
v =: 20 > ]    NB. y less than 20

(f^:v^:_) 0     NB. steady case
0
(f^:v^:_) 1     NB. (f^:1) y, until (v y) = 0
32
(f^:v^:_) 2
32
(f^:v^:_) 5
20
(f^:v^:_) 21   NB. (f^:0) y
21
这就是正在发生的事情:每当
vy
1
,就会执行
(f^:1)y
(f^:1)y
的结果是新的
y
,依此类推

  • 如果
    y
    连续两次保持不变→ 输出
    y
    并停止
  • 如果
    vy
    0
    → 输出
    y
    并停止
因此,这里的
f^:v^:
在小于20(或直到结果不变)时像
double一样工作

让我们看看当
v
返回
2
/
0
而不是
1
/
0
时会发生什么

 v =: 2 * 20 > ]

(f^:v^:_) 0      NB. steady state
0
(f^:v^:_) 1      NB. (f^:2) 1 = 4 -> (f^:2) 4 = 16 -> (f^:2) 16 = 64 [ -> (f^:0) 64 ]
64
(f^:v^:_) 2      NB. (f^:2) 2 = 8 -> (f^:2) 8 = 32 [ -> (f^:0) 32 ]
32
(f^:v^:_) 5      NB. (f^:2) 5 = 20 [ -> (f^:0) 20 ]
20
(f^:v^:_) 21     NB. [ (f^:0) 21 ]
21
通过玩
v
,可以产生多种“奇怪”循环。(它甚至可以返回负整数,以使用
f
)的倒数。

这里有一个副词,可以用于任何代码(相当于 循环体)以创建while循环。如果您以前没有见过它,
^:
是电源连接。更具体地说,短语
f^:ny
将函数
f
应用到参数
y
上,精确地
n
次。计数
n
可能是一个整数或应用于
y
的函数产生一个整数

在上面的副词中,我们看到了两次幂连词,一次在
^:break_子句中,另一次在
^:
中。让我们先讨论后者。那是J表示无穷大的符号。因此,从字面上看,
^:
是“无限次应用函数”或“永远保持重新应用”。这与while循环的函数有关,但如果按字面意思应用,则不是很有用

因此,取而代之的是,
^:
及其近亲被定义为“将函数应用到其极限”,即“继续应用函数,直到其输出匹配其输入”。在这种情况下,再次应用函数将没有效果,因为下一次迭代将具有与上一次相同的输入(请记住,J是一种函数语言)。所以有 再次应用该函数没有意义:它已达到极限

例如:

   cos=:  2&o.   NB. Cosine function
   pi =:  1p1    NB. J's notation for 1*pi^1 analogous to scientific notation 1e1

   cos pi
_1
   cos cos cos pi
0.857553
   cos^:3 pi
0.857553
   cos^:10 pi
0.731404
   cos^:_ pi  NB.  Fixed point of cosine
0.739085
在这里,我们一直应用余弦,直到答案停止变化:余弦已达到其固定点,更多的应用是多余的。我们可以通过显示 中间步骤:

   cos^:a: pi
3.1415926535897 _1 0.54030230586813 ...73 more... 0.73908513321512 0.73908513321
因此,
^:
将函数应用于其极限。好的,那怎么办^:中断条件
?同样,这是一个相同的概念:按右边函数指定的次数应用左边的函数。在
(或其等效函数,
:
)的情况下,输出为“无穷大”,在
中断条件
的情况下,输出为
0
1
,具体取决于输入(中断条件为布尔值)

因此,如果输入是“正确的”(即处理完成),则
break\u条件
将是
0
,而
loop\u body^:break\u条件^:
将变成
loop\u body^:0^:
。显然,
loop\u body^:0
应用
loop\u body
零次,这没有效果

“没有效果”就是让输入保持不变;换句话说,它将输入复制到输出。。。但如果输入与输出匹配,则函数已达到极限!显然,
^::
检测到这个事实并终止。瞧,一会儿



是的,包括零和负整数,“整数”应该更准确地理解为“任意整数数组”(因此该函数可以同时应用于多个幂)。

谢谢!你的最后一句话启发了我!因此,
v
的结果指定重复
f
的次数(如果是负数,则得到
f
的倒数)。完美的我也明白为什么
a:
可以再次阅读字典。基本上,对于某些整数
k
,它转换为
f^:i.k
,这就是为什么会得到多个结果:一个数组被传递到
^:
。如果f^:的整数参数是_1。。。得到函数f的倒数。一种快速定义函数逆的方法!非常感谢。很好的解释,你提供的链接也很有趣。
   cos^:a: pi
3.1415926535897 _1 0.54030230586813 ...73 more... 0.73908513321512 0.73908513321