Как вставить элемент в lisp? - PullRequest
1 голос
/ 02 июня 2019

Я хочу вставить элемент рядом с последним элементом списка, но я знаю только, как вставить элемент рядом с первым элементом списка, кто-нибудь может мне помочь?Пример: (вставить '5' (1 3 2 7 8 9)) должен вывести => (1 3 2 7 8 5 9)

(defun insert (item list)
  (cons (first list)
        (cons item
              (rest list)))) 

//when I do (insert '5 '(1 3 2 7 8 9)) I get (1 5 3 2 7 8 9)

1 Ответ

4 голосов
/ 02 июня 2019

Списки представляют собой односвязные списки, поэтому возможно только добавление в начало без необходимости копировать части списка. Ваша попытка сделать копию первой пары, добавить вашу пару в качестве второго элемента, а затем разделить остальную часть исходного списка с аргументом.

Для добавления в качестве последнего элемента вам нужно сделать это, пока list не станет пустым, а затем вернуть список с одним элементом. Ни один из минусов не будет общим. Итак:

(insert 'x '())  ; ==> (list 'x)
(insert 'x '(1)) ; ==> (cons '1 (insert 'x (cdr '(1))))

Конечно, это можно сделать с помощью append. Лень вознаграждается в программировании:

(defun insert-last (item list)
  (append list (list item)))

Знайте, что если у вас есть рекурсивная функция или итерация, где вы добавляете подобное для многих элементов в зависимости от аргументов, вы делаете очень плохой алгоритм. Гораздо лучше либо использовать loop до collect до конца, либо сделать список задом наперед, а на последнем шаге повернуть его вспять. Тогда вы получите n или 2n пропусков данных вместо n ^ 2.

...