J语言离人们越来越近

J语言的一个显着特征是无需显式使用循环和递归即可编写迭代算法的能力。例如,所有数组元素的总和求解为“ +/”,而所有数组元素的平均值为“ +/%#”。



关于J的各种评论已经在哈布雷(Habré)上发表了不止一次。例如,在这篇文章这一个



J是具有30年历史的语言,并且仍在发展和改进中。但是,J中只有一个“盲点”-带条件停止的迭代算法。为此,建议使用while结构。与休息配对。并继续。



使用while。在J中看起来多余且笨拙。而且,与默认形式相比,它在速度方面严重下降。



并且在该语言的第9版中,添加了新的并集F(以单词“ fold”的第一个字母命名)。







为了进行比较,让我们使用while解决问题。并使用新的并集的

条件很简单:从原始数组中获取一个新数组,其中包含元素的两倍值。新数组的长度是在外部指定的,并且可能小于原始数组的长度。

首先使用while。



t =: dyad define
c =. 0
i =. i.x
z =. $0
while. -. c = y
do. 
z =. z , (+: (c { i))
c =. >: c
end.
z
)
10 t 5
    0 2 4 6 8


现在使用新的并集F的解决方案。让我们添加一下,使用动词Z检查退出循环的条件




COUNT =: 6
v=: dyad define
_2 Z: -.* COUNT =: <: COUNT
x
)
'' +: F:. v (i.10)
    0 2 4 6 8


该文档保证F.将不仅更方便,而且速度更快。最终,J与人们的距离越来越近了!



PS博学的人们可能会注意到,无需使用周期性结构和新结构即可轻松解决此问题。提取所需长度的子数组,然后以默认形式进行处理就足够了。但是,在实际问题中,经常发生以下情况:子数组的长度事先未知,并且在算法运行期间计算了停止条件。



All Articles