3

为了熟悉 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].

我唯一的问题是:这是什么“|” 在列表项之间签名意味着什么?!

谢谢你们!

4

3 回答 3

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]

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

于 2012-06-10T14:37:57.500 回答
5

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

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

> [1,2,3 | [2]].
[1,2,3,2]
于 2012-06-10T14:32:54.780 回答
1

第一:谢谢各位!

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

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

于 2012-06-10T19:37:45.223 回答