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