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

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

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

  1. x — список, который необходимо отсортировать.
  2. NIL — результат сортировки пустого списка.
  3. T — логическое значение, используемое в качестве условного выражения в конструкции COND.
  4. APPEND — оператор, добавляющий элементы в начало результирующего списка.
  5. remove-if — оператор, удаляющий из списка все элементы, для которых выполняется заданное условие.
  6. FUNCTION — оператор, создающий функцию.
  7. LAMBDA — оператор, определяющий анонимную функцию.
  8. z — параметр, передаваемый в анонимную функцию.
  9. (CAR x) — операция извлечения первого элемента из списка x.
  10. (CDR x) — операция извлечения списка, следующего за первым элементом списка x.
  11. msort — рекурсивный вызов функции сортировки.
  12. (CADR z) — операция извлечения второго элемента из списка z.
  13. (LIST (CAR x)) — создание нового списка, содержащего только первый элемент из списка x.
  14. (msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x)) — рекурсивный вызов функции сортировки с отфильтрованным списком.
  15. (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x)) — удаление из списка x всех элементов, для которых выполняется заданное условие.
  16. (CADAR x) — операция извлечения второго элемента из списка x.
  17. NIL — результат удаления пустого списка.
  18. (APPEND (msort (remove-if (FUNCTION (LAMBDA (z) (> (cadr z) (CADAR x)))) (CDR x))) — добавление отсортированного списка в начало результирующего списка.
  19. (LIST (CAR x)) — создание нового списка, содержащего только первый элемент из списка x.
  20. (msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x)) — рекурсивный вызов функции сортировки с отфильтрованным списком.

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


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

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

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