由于我是 J 的初学者,我决定使用这种语言解决一个简单的任务,特别是实现冒泡排序算法。我知道在函数式语言中解决此类问题并不是惯用的,因为在 C 等命令式语言中使用数组元素转置自然地解决了它,而不是在声明性语言中构造修改后的列表。然而,这是我写的代码:
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
这是语句的结构:
┌────────────────────────────────────────────────────────────────────────────┬──┬─┐
│┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│
││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││ │ │
│││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││ ││1│<│#│││ │ │
││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││ │└─┴─┴─┘││ │ │
│││││<.│/││ ││2│&│{.│││ ││ │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││ │ ││ │ │
││││└──┴─┘│ │└─┴─┴──┘││ ││ │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&│}.│││││ │ ││ │ │
│││└──────┴─┴────────┘│ ││ │ ││││>.│/││ ││2│&│{.│││ │└─┴─┴──┘││││ │ ││ │ │
│││ │ ││ │ │││└──┴─┘│ │└─┴─┴──┘││ │ ││││ │ ││ │ │
│││ │ ││ │ ││└──────┴─┴────────┘│ │ ││││ │ ││ │ │
│││ │ ││ │ │└───────────────────┴─┴────────┘│││ │ ││ │ │
│││ │ │└──┴─┴────────────────────────────────┘││ │ ││ │ │
││└───────────────────┴─┴───────────────────────────────────────┘│ │ ││ │ │
│└───────────────────────────────────────────────────────────────┴──┴───────┘│ │ │
└────────────────────────────────────────────────────────────────────────────┴──┴─┘
让我们将其应用于数组:
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2
2 3 5 7 8
让我感到困惑的是$:
指最外面的括号内的陈述。帮助说:
$:
表示包含它的最长动词。
另一本书(~300 KiB)说:
3+4
7
5*20
100
上述短语中加号和 时间的+ 和 * 等符号称为动词,表示功能。J 短语中可能有多个动词,在这种情况下,它就像简单英语中的句子一样,从左到右阅读,即 添加到后面的任何内容,
4+6%2
即除以。4
6
2
让我们重写我的代码片段,省略最外层()
:
((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2
2 3 5 7 8
结果是一样的。我无法解释自己为什么这样有效,为什么 only((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
被视为最长的动词$:
而不是整个表达式((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #
,而不仅仅是(<./@(2&{.)), $:@((>./@(2&{.)),2&}.)
,因为如果((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
是动词,它还应该在与 连词后形成另一个动词#
,即一个人可能会对待整个句子(第一个片段)作为动词。一个连词限制的动词长度可能有一些限制。
看下面的代码(从这里):
factorial =: (* factorial@<:) ^: (1&<)
factorial 4
24
factorial
within 表达式是指整个函数,即(* factorial@<:) ^: (1&<)
.
在此示例之后,我使用了函数名称而不是$:
:
bubblesort =: (((<./@(2&{.)), bubblesort@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
bubblesort 5 3 8 7 2
2 3 5 7 8
我希望bubblesort
引用整个函数,但对我来说似乎并不正确,因为结果是正确的。
如果您有其他实现,我还想看看其他实现,甚至稍微重构。
谢谢。