2016-07-19 6 views
2

erlangではすべてが不変ですか?では、リストの先頭に要素を追加すると、リストの新しいコピーが作成されず、appendを使用するたびに新しいコピーが作成されます。リストの先頭に追加しないで、erlangに新しいリストを作成しますか?

から引用:
リストを再作成して作成するときは、リストの先頭に新しい要素を追加することが重要です。このようにして、増加する結果リストの数百または数千のコピーではなく、1つのリストを作成します。

最後に追加しない理由のたびにリンクリストをトラバースしていませんか?

答えて

6

Erlangはリストに単一リンクリストを使用します。ヘッドを追加してもテールは変更されません。あなたがリストT = [10, 50, 40]を持っていると想像してください。頭を追加すると[20 | T]となり、その結果は写真のようになります。 [10, 50, 40]の部分が変更されていないことがわかります。

enter image description here

+0

私はなぜリストの "++"が良い方法ではないか知りたいですか?詳細説明を教えてください。 – BlackMamba

+1

リスト内の最後のノードは、「次の」ノードへのNULL参照を持ちます(最後のノードには存在しません)。2つのリストが結合されている場合、リストの最後のノードの1つは、 2番目のリストのErlangではデータが不変なので、新しい最後のノードを作成して、他のリストの開始点を指すようにする必要があります。次に、最後から2番目のノードは、新しい「最後の」ノードを指し示さなければならない。要約すると: 'a ++ b'では、' a'を 'b'の前に完全にコピーする必要があります。元の 'a'はまったく変更されていません。 – RichN

関連する問題