Стандартная схема в Scheme для создания списка по частям состоит в том, чтобы добавить элементы вперед, используя cons
, а не пытаться set-cdr!
последней cons-ячейки в списке. В конце, когда ваш список готов, вы можете использовать reverse
, чтобы получить элементы в правильном порядке. Таким образом, мутация списка не нужна сама по себе.
Итак, если вы пытаетесь создать список (1 2 3)
по частям:
- Начните с пустого списка,
()
и cons
1 к нему. Это дает вам (1)
.
- Затем
cons
2 к списку: (2 1)
- Затем
cons
3 к списку: (3 2 1)
- Наконец, когда вы закончите построение списка, переверните его:
(1 2 3)
Вы можете спросить, почему это "лучше". Это потому, что доступ к последней паре к set-cdr!
является операцией O (n); со связанными списками элементы не имеют произвольного доступа, а являются линейными в зависимости от позиции элемента, к которой осуществляется доступ. Принимая во внимание, что cons
всегда является O (1).
reverse
является операцией O (n), но до тех пор, пока вы делаете это только в конце (когда вы готовы построить список в правильном порядке), а не вызываете ее постоянно, это не повлияет на производительность.