Определить функцию MERGE которая создает из двух списков цифровых атомов новый отсортированный список - Lisp
Формулировка задачи:
Определить функцию MERGE которая создает из двух списков цифровых атомов новый отсортированный список. Повторения пропускаются
(MERGE ’(3 4 7 8 11) ’(1 4 5 8 15)) -> (1 3 4 5 7 8 11 15)
Решение задачи: «Определить функцию MERGE которая создает из двух списков цифровых атомов новый отсортированный список»
textual
Листинг программы
;; Двухпутевое слияние (defun merge-2 (lst1 lst2) (cond ((null lst1) lst2) ((null lst2) lst1) ((< (car lst1) (car lst2)) (cons (car lst1) (merge-2 (cdr lst1) lst2))) (t (cons (car lst2) (merge-2 lst1 (cdr lst2)))))) ==> MERGE-2 (merge-2 '(1 2 3 4) '(2 3 5 6 7)) ==> (1 2 2 3 3 4 5 6 7) ;; Общее слияние (defun merge (&rest r) (cond ((null (cdr r)) (car r)) (t (let ((tmp (merge-2 (car r) (cadr r)))) (apply 'merge (cons tmp (cddr r))))))) ==> MERGE (merge '(1 2 3 4) '(2 3 4 5 6) '(-1 0 0 8)) ==> (-1 0 0 1 2 2 3 3 4 4 5 6 8) (merge '(1 2 3 4) '(2 3 4 5 6) '(-1 0 0 8) '(1 4 8 16 32 64)) ==> (-1 0 0 1 1 2 2 3 3 4 4 4 5 6 8 8 16 32 64)
Объяснение кода листинга программы
В коде представлены две функции: merge-2 и merge.
Функция merge-2 реализует двухпутевое слияние двух списков.
Функция merge реализует общее слияние нескольких списков.
Давайте разберем код функции merge-2 по порядку:
(defun merge-2 (lst1 lst2) ...)- определение функцииmerge-2с двумя аргументамиlst1иlst2, которые являются списками цифровых атомов.(cond ((null lst1) lst2) ...)- это конструкцияcond, которая проверяет, является ли первый списокlst1пустым. Если это так, то возвращается второй списокlst2.(cond ((null lst2) lst1) ...)- это еще одна конструкцияcond, которая проверяет, является ли второй списокlst2пустым. Если это так, то возвращается первый списокlst1.(cond ((< (car lst1) (car lst2)) (cons (car lst1) (merge-2 (cdr lst1) lst2))) ...)- это еще одна конструкцияcond, которая сравнивает первый элемент первого спискаlst1с первым элементом второго спискаlst2. Если первый элементlst1меньше, то возвращается новый список, в котором первый элементlst1добавлен в начало, а остальная часть спискаlst1рекурсивно обрабатывается функциейmerge-2.(t (cons (car lst2) (merge-2 lst1 (cdr lst2)))))- это еще одна конструкцияcond, которая возвращает новый список, в котором первый элементlst2добавлен в начало, а остальная часть спискаlst1рекурсивно обрабатывается функциейmerge-2. Теперь рассмотрим код функцииmerge:(defun merge (&rest r) ...)- определение функцииmergeс произвольным числом аргументовr, которые являются списками цифровых атомов.(cond ((null (cdr r)) (car r)) ...)- это конструкцияcond, которая проверяет, является ли последний список вrпустым. Если это так, то возвращается первый элемент последнего списка.(t (let ((tmp (merge-2 (car r) (cadr r)))) ...))- это еще одна конструкцияcond, которая проверяет, является ли последний список вrне пустым. Если это так, то создается новый списокtmp, который является результатом слияния первого элемента первого спискаrи первого элемента второго спискаr. Затем, с помощью функцииapply, новый списокtmpобъединяется с остальной частью списковr. Таким образом, функцияmergeрекурсивно объединяет несколько списков в один отсортированный список.