5

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

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

a:是一个空盒子,我知道它有一个特殊的含义,^:但即使在查过字典后我也无法理解。

谢谢。

4

2 回答 2

6

摘自并改编自我在 2009 年发布到 J 论坛的较长文章

while =:  ^:break_clause^:_

这是一个副词,您可以将其应用于任何代码(相当于循环体)来创建一个 while 循环。如果你以前没见过,那^: 就是力量合相。更具体地说,该短语f^:n y将函数准确地应用于f参数。计数可能是整数或应用于产生整数的函数¹。ynny

在上面的副词中,我们看到两次力量连词,一次是 in ^:break_clause,一次是 in ^:_ 。我们先讨论后者。这_ 就是 J 的无穷大符号。所以,从字面上看,^:_ 是“无限次地应用函数”或“永远重新应用”。这与 while 循环的功能有关,但如果按字面意思应用,它并不是很有用。

因此,相反,^:_ 它的 kin 被定义为“将函数应用到其极限”,即“继续应用该函数,直到其输出与输入匹配”。在这种情况下,再次应用该函数将无效,因为下一次迭代将具有与前一次相同的输入(请记住,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

因此,^:_将函数应用到其极限。好的,那怎么^:break_condition办?同样,这是相同的概念:将左侧函数应用到右侧函数指定的次数。在_ (或其等效函数,_: )的情况下,输出是“无穷大”,在break_condition输出将是01取决于输入的情况下(中断条件是布尔值)。

因此,如果输入是“正确的”(即处理完成),那么break_condition将是0,从哪里loop_body^:break_condition^:_变成loop_body^:0^:_ 。显然,loop_body^:0应用loop_body零次,没有效果。

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


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

于 2013-09-08T16:12:58.657 回答
3

f^:proposition^:_不是一个while循环。返回时它(几乎)是一个while循环或。当返回其他结果时,这是一种奇怪的 while 循环。proposition10proposition

让我们看一个简单的一元案例。

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

v y这就是正在发生的事情:每次执行1, (f^:1) y。结果(f^:1) y是新的y等等。

  • 如果y连续两次保持不变→输出y并停止。
  • 如果v y0→输出y并停止。

所以f^:v^:_在这里,像double while less than 20 (or until the result doesn't change)

让我们看看当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)。

于 2013-09-08T12:51:35.753 回答