Erlang List连接,怪异的“|”标志

时间:2012-06-10 14:20:44

标签: list erlang concatenation bubble-sort

为了熟悉Erlang,我正在努力 写我自己的Bubblesort算法。现在,我有 我的模块中的以下代码:

-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].

我唯一的问题是:这是什么“|”在listitems之间的标志意味着什么?!

谢谢大家!

3 个答案:

答案 0 :(得分:6)

列表可以有两种形式:它是空的([]),或者它有头部和尾部([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]

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

首先:谢谢你们!

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

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