代码之家  ›  专栏  ›  技术社区  ›  YasirA

J:气泡排序默认实现中的自引用

  •  1
  • YasirA  · 技术社区  · 15 年前

    因为我是J的初学者,所以我决定用这种语言解决一个简单的任务,特别是实现BubbleSort算法。我知道在函数语言中解决这类问题不是惯用的方法,因为在命令式语言(如C)中使用数组元素转置自然解决了问题,而不是在声明性语言中构造修改后的列表。然而,这就是我写的代码:

        (((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
    

    陈述的结构如下:

    ┌────────────────────────────────────────────────────────────────────────────┬──┬─┐
    │┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│
    ││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││  │ │
    │││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││  ││1│<│#│││  │ │
    ││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││  │└─┴─┴─┘││  │ │
    │││││<.│/││ ││2│&│{.│││ ││  │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││  │       ││  │ │
    ││││└──┴─┘│ │└─┴─┴──┘││ ││  │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&│}.│││││  │       ││  │ │
    │││└──────┴─┴────────┘│ ││  │ ││││>.│/││ ││2│&│{.│││ │└─┴─┴──┘││││  │       ││  │ │
    │││                   │ ││  │ │││└──┴─┘│ │└─┴─┴──┘││ │        ││││  │       ││  │ │
    │││                   │ ││  │ ││└──────┴─┴────────┘│ │        ││││  │       ││  │ │
    │││                   │ ││  │ │└───────────────────┴─┴────────┘│││  │       ││  │ │
    │││                   │ │└──┴─┴────────────────────────────────┘││  │       ││  │ │
    ││└───────────────────┴─┴───────────────────────────────────────┘│  │       ││  │ │
    │└───────────────────────────────────────────────────────────────┴──┴───────┘│  │ │
    └────────────────────────────────────────────────────────────────────────────┴──┴─┘
    

    让我们将其应用于数组:

        (((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2
    2 3 5 7 8
    

    让我困惑的是 $: 指最外面括号内的语句。 Help 说:

    美元: 表示最长的动词 包含它。

    The other book (约300 kib)说:

        3+4 
    7  
        5*20  
    100  
    

    符号如+和*表示 时代 在上面的短语中称为 动词和表示函数。你可以 在j短语中有多个动词, 在这种情况下,它的构造就像 简单英语句子 阅读 从左到右 ,那就是 4+6%2 方法 4 加在后面的内容上,即 6 除以 2 .

    让我们重写我的代码片段,去掉最外层 () S:

        ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2
    2 3 5 7 8
    

    重复使用是相同的。我无法解释为什么这会起作用,为什么只有 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) 被认为是最长的动词 美元: 但不是整个表达 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 而不仅仅是 (<./@(2&{.)), $:@((>./@(2&{.)),2&}.) 因为如果 (</@(2&.),$:@(>/@(2&.)),2&.))^:(1<) 是一个动词,它还应该在与 # 也就是说,人们可以把整个句子(第一个片段)当作动词。可能动词长度受一个连词的限制。

    看下面的代码( from here ):

        factorial =: (* factorial@<:) ^: (1&<)
        factorial 4
    24
    

    factorial 在表达式中指的是整个函数,即。 (* factorial@<:) ^: (1&<) .

    在这个例子中,我使用了一个函数名,而不是 美元: :

        bubblesort =: (((<./@(2&{.)), bubblesort@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
        bubblesort 5 3 8 7 2
    2 3 5 7 8
    

    我期待 bubblesort 引用整个函数,但对我来说似乎不正确,因为结果是正确的。

    另外,如果您有其他实现,我希望看到它们,甚至稍微重构一下。

    谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   estanford    15 年前

    我正在调查。同时,你是因为你特别需要冒泡而实现冒泡,还是因为你只是简单地需要一种排序(即,你能摆脱使用 /:~ 相反)?

    编辑:您是否尝试在类似 3 1 2 9 2 9 86 5 9 6 9 6 45 ?当我在我的机器上尝试它时,系统挂起了,但是如果你用一个替换结尾,它就会工作。

        2
  •  1
  •   Community CDub    8 年前

    根据 this reference (175 KIB) 结合 是:

    演讲的一部分需要两个 参数,通常会导致 动词。例如, *:^:3 是一个 迭代平方三的函数 时代( ^: 是一个 结合 )

    AS ^: 属于上述类别,将其应用于参数会导致较长的动词:

    ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
    

    因为 $: 表示包含它的最长动词,它指上面刚刚写的代码。

    同样,下一个 ^: 使新的较长动词来自 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) # :

    (((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
    

    反过来又被提到 美元: 因为它比前一个长。

    因为这是不受欢迎的行为,所以唯一的解决办法可能是拆分整个动词,以便 美元: 指的是 (</@(2&.),$:@(>/@(2&.)),2&.))^:(1<) 虽然它不是一条直线:

        bubbleiter =: ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
        bubblesort =: bubbleiter ^: #
        bubblesort 3 1 2 9 2 9 86 5 9 6 9 6 45
    1 2 2 3 5 6 6 9 9 9 9 45 86
    

    This article 美元: :

    解释什么 美元: (自参考) 是吗?它是如何使用的? 一个相当不幸的起点 对于那些全新的 因为这是一种高级语言 特点和不典型的方式 事情通常在J.约翰身上做。 提到罗杰评论过 如果他 正在设计语言。

    再总结一下:

    • ^: 是一个 结合 制造一个新的 动词 从它的论点来看;
    • 美元: 表示最长的 动词 包含它的。

    谢谢飞到 estanford 数据集 3 1 2 9 2 9 86 5 9 6 9 6 45 在他的回答中。

        3
  •  0
  •   rdm    14 年前

    下面是在j中实现气泡排序的另一种方法: http://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort#J

    推荐文章