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

リストには 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]ます。

したがって、そのようなものが表示された場合は、テールが適切なリストではないリストを作成したことになります。

于 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 に答える