【问题标题】:Erlang List concatenation, weird "|" signErlang List 连接,奇怪的“|”标志
【发布时间】:2012-06-13 17:29:48
【问题描述】:

为了熟悉 Erlang,我正在尝试 编写我自己的冒泡排序算法。现在,我有 我的模块中的以下代码:

-module(mysort).
-export([bubblesort/1]).

bubblesort(L) ->
    sort_sequence(L, []).

sort_sequence([H1|[H2|T]], Sorted) ->
    if H2 >= H1 ->
        sort_sequence(T, Sorted ++ [H1, H2]);
    H2 < H1 ->
        sort_sequence(T, Sorted ++ [H2, H1])
    end;
sort_sequence([H|T], Sorted) ->
    Sorted ++ H;
sort_sequence([], Sorted) ->
    Sorted.

首先:请不要对我的代码提出建议 我想自己解决^^

问题是:如果我说mysort:bubblesort([2,1,3,4,5]). 输出如我所料:[1,2,3,4,5]

但如果我说mysort:bubblesort([2,1,3,5,4]). 输出为:[1,2,3,5|4].

我唯一的问题是:这个“|”是什么意思?列表项之间的符号是什么意思?!

谢谢大家!

【问题讨论】:

    标签: list erlang concatenation bubble-sort


    【解决方案1】:

    首先:谢谢你们!

    sort_sequence([H|T], Sorted) ->
        Sorted ++ H;
    

    我将单个项目连接到列表中,这当然是 不是一个适当的清单;这导致了你的错误 都解释了

    【讨论】:

      【解决方案2】:

      列表可以有两种形式:要么是空的 ([]),要么是有头有尾的 ([H|T])。所以[]是一个空列表,[1 | []]是一个头部为1,尾部为[]的列表,[1|2]是一个头部为1,尾部为2的列表。

      如果列表为空或其尾部是正确列表,则该列表称为正确列表。所以[] 是一个正确的列表,因为它是空的,[1|[]] 是一个正确的列表,因为它的尾部是空列表(这是一个正确的列表),但是[1|2] 不是一个正确的列表,因为它的尾部是 2 和 2不是一个合适的列表。

      由于正确的列表是最常见的列表类型,并且像这样以嵌套列表的形式读取和写入它们有点麻烦,因此它们有一种特殊的语法:显示正确的列表并且可以通过将头部分开来编写用逗号进行子列表。因此,如果我们有正确的列表[1 | [2 | [3 | []]]],它会显示为[1,2,3](我们也可以这样写),这样更具可读性。

      此格式也用于显示不正确列表的开头,如果它们“开始”正确直到非正确尾部所在的位置,它将用| 分隔。例如,如果我们有不正确的列表[1 | [2 | [3|4]]](这是不正确的,因为最里面的尾巴是4,这不是正确的列表),它将显示为[1,2,3|4],以区别于正确的列表[1 | [2 | [ 3 | [4 | []]]]],这将显示为[1,2,3,4]

      因此,如果您看到类似的内容,则您以某种方式创建了一个列表,其尾部不是正确的列表。

      【讨论】:

      • 谢谢,你解释得很好 :-) Erlang 来自 C、Java 和 Python 等语言,是我的第一个函数式语言(尽管 Python 也可以编程为函数式),它完全是 f* **s 我的大脑了 <_>
      【解决方案3】:

      当尾部未列出时会发生这种情况:

      > [1,2,3 | 2].
      [1,2,3|2]
      
      > [1,2,3 | [2]].
      [1,2,3,2]
      

      【讨论】:

        猜你喜欢
        • 2012-01-01
        • 1970-01-01
        • 2016-12-01
        • 2023-03-29
        • 2015-07-12
        • 1970-01-01
        • 2020-05-17
        • 2011-06-14
        • 1970-01-01
        相关资源
        最近更新 更多