Определить функцию MERGE которая создает из двух списков цифровых атомов новый отсортированный список - Lisp

Узнай цену своей работы

Формулировка задачи:

Определить функцию MERGE которая создает из двух списков цифровых атомов новый отсортированный список. Повторения пропускаются (MERGE ’(3 4 7 8 11) ’(1 4 5 8 15)) -> (1 3 4 5 7 8 11 15)

Решение задачи: «Определить функцию MERGE которая создает из двух списков цифровых атомов новый отсортированный список»

textual
Листинг программы
  1. ;; Двухпутевое слияние
  2.  
  3. (defun merge-2 (lst1 lst2)
  4.   (cond ((null lst1) lst2)
  5.         ((null lst2) lst1)
  6.         ((< (car lst1) (car lst2)) (cons (car lst1) (merge-2 (cdr lst1) lst2)))
  7.         (t (cons (car lst2) (merge-2 lst1 (cdr lst2))))))
  8.  
  9. ==> MERGE-2
  10.  
  11. (merge-2 '(1 2 3 4) '(2 3 5 6 7))
  12.  
  13. ==> (1 2 2 3 3 4 5 6 7)
  14.  
  15. ;; Общее слияние
  16.  
  17. (defun merge (&rest r)
  18.   (cond ((null (cdr r)) (car r))
  19.         (t (let ((tmp (merge-2 (car r) (cadr r))))
  20.              (apply 'merge (cons tmp (cddr r)))))))    
  21.  
  22. ==> MERGE
  23.  
  24. (merge '(1 2 3 4) '(2 3 4 5 6) '(-1 0 0 8))
  25.  
  26. ==> (-1 0 0 1 2 2 3 3 4 4 5 6 8)
  27.  
  28. (merge '(1 2 3 4) '(2 3 4 5 6) '(-1 0 0 8) '(1 4 8 16 32 64))
  29.  
  30. ==> (-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 по порядку:

  1. (defun merge-2 (lst1 lst2) ...) - определение функции merge-2 с двумя аргументами lst1 и lst2, которые являются списками цифровых атомов.
  2. (cond ((null lst1) lst2) ...) - это конструкция cond, которая проверяет, является ли первый список lst1 пустым. Если это так, то возвращается второй список lst2.
  3. (cond ((null lst2) lst1) ...) - это еще одна конструкция cond, которая проверяет, является ли второй список lst2 пустым. Если это так, то возвращается первый список lst1.
  4. (cond ((< (car lst1) (car lst2)) (cons (car lst1) (merge-2 (cdr lst1) lst2))) ...) - это еще одна конструкция cond, которая сравнивает первый элемент первого списка lst1 с первым элементом второго списка lst2. Если первый элемент lst1 меньше, то возвращается новый список, в котором первый элемент lst1 добавлен в начало, а остальная часть списка lst1 рекурсивно обрабатывается функцией merge-2.
  5. (t (cons (car lst2) (merge-2 lst1 (cdr lst2))))) - это еще одна конструкция cond, которая возвращает новый список, в котором первый элемент lst2 добавлен в начало, а остальная часть списка lst1 рекурсивно обрабатывается функцией merge-2. Теперь рассмотрим код функции merge:
  6. (defun merge (&rest r) ...) - определение функции merge с произвольным числом аргументов r, которые являются списками цифровых атомов.
  7. (cond ((null (cdr r)) (car r)) ...) - это конструкция cond, которая проверяет, является ли последний список в r пустым. Если это так, то возвращается первый элемент последнего списка.
  8. (t (let ((tmp (merge-2 (car r) (cadr r)))) ...)) - это еще одна конструкция cond, которая проверяет, является ли последний список в r не пустым. Если это так, то создается новый список tmp, который является результатом слияния первого элемента первого списка r и первого элемента второго списка r. Затем, с помощью функции apply, новый список tmp объединяется с остальной частью списков r. Таким образом, функция merge рекурсивно объединяет несколько списков в один отсортированный список.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы