Список атомов. Написать программу, возвращающую список заданного вида - 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))— рекурсивный вызов функции сортировки с отфильтрованным списком.