mar*_*itz 3 erlang list 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.
Run Code Online (Sandbox Code Playgroud)
首先:请不要给我建议我的代码 我想弄清楚自己^^
问题是:如果我说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之间意味着什么?!
谢谢你们!
列表可以有两种形式:它是空的([]),或者它有一个头和一个尾([H|T]).所以[]是一个空列表,[1 | []]是一个头部为1且尾部为的列表[],[1|2]是一个头部为1且尾部为2的列表.
如果列表为空或其尾部是正确的列表,则列表称为正确列表.所以[]是一个正确的列表,因为它是空的并且[1|[]]是一个正确的列表,因为它的尾部是空列表(这是一个正确的列表),但[1|2]它不是一个正确的列表,因为它的尾部是2和2不是一个正确的列表.
由于正确的列表是最常见的列表类型,并且它们作为嵌套列表进行读取和写入是很麻烦的,因此它们有一种特殊的语法:显示正确的列表,可以通过用逗号分隔子列表的头部来编写.因此,如果我们有正确的列表,[1 | [2 | [3 | []]]]它将显示为[1,2,3](我们也可以这样写),它更具可读性.
这种格式也用于显示不正确列表的开头,如果它们"开始"正确到非正确尾部的点,将用a分隔|.因此,例如,如果我们有不正确的列表[1 | [2 | [3|4]]](这是不正确的,因为最里面的尾部是4,这不是一个正确的列表),它将被显示为[1,2,3|4]将其与正确的列表区分开来,该列表[1 | [2 | [ 3 | [4 | []]]]]将显示为[1,2,3,4].
所以如果你看到类似的东西,你会以某种方式创建一个尾部不是正确列表的列表.
当tail不列出时会发生这种情况:
> [1,2,3 | 2].
[1,2,3|2]
> [1,2,3 | [2]].
[1,2,3,2]
Run Code Online (Sandbox Code Playgroud)