Сортировать по росту все положительные числа - Lisp

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

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

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

Решение задачи: «Сортировать по росту все положительные числа»

textual
Листинг программы
;; Пересечение множеств:
 
(defun inters (x1 x2)
  (if (null x1) nil
      (if (member (car x1) x2) (cons (car x1) (inters (cdr x1) x2)) 
                               (inters (cdr x1) x2))))
 
;; Сортировка выбором
 
(defun vsort (x)
  (if (null x) nil
    (let ((min (apply #'min x)))
         (cons min (vsort (remove-if #'(lambda (y) (= y min)) x :count 1)))))) 
 
;; Решение
 
(defun task (x1 x2)
  (vsort (inters x1 x2)))
 
(task '(1 2 3 -1 23 45 5) '(3 4 5 45 16 23 -1))
 
==> (-1 3 5 23 45)

Объяснение кода листинга программы

В коде даны три функции:

  1. Функция пересечения множеств inters принимает два множества в качестве аргументов и возвращает множество, содержащее только элементы, которые есть в обоих множествах. Реализована с помощью рекурсии.
  2. Функция сортировки выбором vsort принимает список в качестве аргумента и возвращает список, отсортированный по возрастанию. Реализована с помощью рекурсии и цикла.
  3. Функция task принимает два списка в качестве аргументов и возвращает список, содержащий только положительные числа из обоих списков, отсортированные по росту. Вот разбор кода по шагам:
  4. Создаются три функции: inters, vsort, task.
  5. Функция inters принимает два множества в качестве аргументов и возвращает множество, содержащее только элементы, которые есть в обоих множествах. Реализована с помощью рекурсии. Рекурсия заканчивается, когда первое множество становится пустым.
  6. Функция vsort принимает список в качестве аргумента и возвращает список, отсортированный по возрастанию. Реализована с помощью рекурсии и цикла. В основе рекурсии лежит выбор минимального элемента из списка, который помещается в начало нового списка. Цикл позволяет продолжать выбор новых минимальных элементов до тех пор, пока исходный список не станет пустым.
  7. Функция task принимает два списка в качестве аргументов и возвращает список, содержащий только положительные числа из обоих списков, отсортированные по росту. Сначала выполняется пересечение множеств с помощью функции inters, затем полученный список сортируется по возрастанию с помощью функции vsort.
  8. Вызывается функция task с двумя списками в качестве аргументов: '(1 2 3 -1 23 45 5)' и '(3 4 5 45 16 23 -1). После выполнения функции возвращается отсортированный список: -1 3 5 23 45.

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


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

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

11   голосов , оценка 4.455 из 5
Похожие ответы