2016-07-19 1 views
2

В erlang все неизменно верно? Итак, как добавление элемента в список списка не создает новую копию списка, где при использовании append каждый раз создается новая копия?Не добавляет ли глава списка создать новый список в erlang?

Цитата из erlang.org:
При рекурсии и построении списка важно обеспечить присоединение новых элементов к началу списка. Таким образом, вы создадите один список, а не сотни или тысячи копий растущего списка результатов.

Не пересекайте связанный список каждый раз, когда причина не добавляется в конце?

ответ

6

Erlang использует один связанный список для списков. Добавление головы не изменяет хвост. Представьте, что у вас есть список T = [10, 50, 40]. Добавление головы - [20 | T], и результат выглядит как на картинке. Вы можете видеть, что часть [10, 50, 40] не изменяется.

enter image description here

+0

Я хочу знать, почему «++» для списка не является хорошим способом? Не могли бы вы дать подробное объяснение? – BlackMamba

+1

Последний узел в списке имеет NULL ссылку на «следующий» узел (который, очевидно, не существует для последнего узла.) Когда два списка объединены, одному из последних узлов списка нужно ссылаться на начало второго списка. Поскольку данные в Erlang неизменяемы, необходимо создать новый последний узел, чтобы указать на начало другого списка. Затем следующий-последний узел должен указывать на новый «последний» узел. Подводя итог: в 'a ++ b',' a' нужно будет полностью скопировать в начало 'b'. И оригинал 'a' не будет изменен вообще. – RichN

Смежные вопросы