Список атомов. Написать программу, возвращающую список заданного вида - Lisp
Формулировка задачи:
приветствую всех! очень нужно решить задачу, ну никак не идёт! заранее всем спасибо
Есть список атомов. Написать программу, возвращающую список вида: первый элемент — атом исходного списка, появляющийся в списке один раз, второй элемент — атом, появляющийся два раза и т.д. Если есть несколько атомов, появляющихся одинаковое количество раз, то их объединить в список
Решение задачи: «Список атомов. Написать программу, возвращающую список заданного вида»
textual
Листинг программы
(defun msort (x) (COND ((NULL x) NIL) (T (APPEND (msort (remove-if (FUNCTION (LAMBDA (z) (> (cadr z) (CADAR x)))) (CDR x))) (LIST (CAR x)) (msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x)))))))
Объяснение кода листинга программы
В данном коде реализована функция сортировки списка по возрастанию. Вот список номеров и названий переменных с их значениями:
x
— список, который необходимо отсортировать.NIL
— результат сортировки пустого списка.T
— логическое значение, используемое в качестве условного выражения в конструкцииCOND
.APPEND
— оператор, добавляющий элементы в начало результирующего списка.remove-if
— оператор, удаляющий из списка все элементы, для которых выполняется заданное условие.FUNCTION
— оператор, создающий функцию.LAMBDA
— оператор, определяющий анонимную функцию.z
— параметр, передаваемый в анонимную функцию.(CAR x)
— операция извлечения первого элемента из спискаx
.(CDR x)
— операция извлечения списка, следующего за первым элементом спискаx
.msort
— рекурсивный вызов функции сортировки.(CADR z)
— операция извлечения второго элемента из спискаz
.(LIST (CAR x))
— создание нового списка, содержащего только первый элемент из спискаx
.(msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x))
— рекурсивный вызов функции сортировки с отфильтрованным списком.(remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x))
— удаление из спискаx
всех элементов, для которых выполняется заданное условие.(CADAR x)
— операция извлечения второго элемента из спискаx
.NIL
— результат удаления пустого списка.(APPEND (msort (remove-if (FUNCTION (LAMBDA (z) (> (cadr z) (CADAR x)))) (CDR x)))
— добавление отсортированного списка в начало результирующего списка.(LIST (CAR x))
— создание нового списка, содержащего только первый элемент из спискаx
.(msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x))
— рекурсивный вызов функции сортировки с отфильтрованным списком.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д