Рекурсивная сортировка без повторяющихся элементов - Lisp

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

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

Есть сортировка
(defun sorting (lst)
  (cond ((null lst) nil)
        (T (append (sorting (remove-if (lambda (x) (< (car lst) x)) (cdr lst)))
                         (list (car lst))
                   (sorting (remove-if (lambda (x) (>= (car lst) x)) (cdr lst)))))))
 
(sorting '(1 2 3 2 -5 -2 0 3))
Нужно модернизировать так, чтобы убрать повторяющиеся элементы

Решение задачи: «Рекурсивная сортировка без повторяющихся элементов»

textual
Листинг программы
(defun sorting (lst)
  (cond ((null lst) nil)
        (T (append (sorting (remove-if (lambda (x) (< (car lst) x)) (cdr lst)))
                         (list (car lst))
                   (sorting (remove-if (lambda (x) (>= (car lst) x)) (cdr lst)))))))
 
==> SORTING
 
(defun ssort (lst)
  (sorting (setof lst)))
 
==> SSORT
 
(ssort '(1 2 3 2 -5 -2 0 3))
 
==> (-5 -2 0 1 2 3)

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

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

  1. (defun sorting (lst)
  2. (cond ((null lst) nil)
  3. (T (append (sorting (remove-if (lambda (x) (< (car lst) x)) (cdr lst)))
  4. (list (car lst))
  5. **(sorting (remove-if (lambda (x) (>= (car lst) x)) (cdr lst))))))) Функция sorting принимает на вход список lst и рекурсивно сортирует его без повторяющихся элементов. В условии cond проверяется, является ли список пустым (null lst). Если это так, то возвращается nil. Если список не пустой, то возвращается результат рекурсивного вызова функции sorting для списка, полученного после удаления элементов, меньших или равных первому элементу списка (remove-if (lambda (x) (< (car lst) x)) (cdr lst)). К этому результату добавляется первый элемент списка lst в виде списка из одного элемента (list (car lst)). Также выполняется рекурсивный вызов функции sorting для списка, полученного после удаления элементов, больших или равных первому элементу списка (remove-if (lambda (x) (>= (car lst) x)) (cdr lst)).
  6. (defun ssort (lst)
  7. (sorting (setof lst))) Функция ssort принимает на вход список lst и возвращает отсортированный список без повторяющихся элементов, полученный путем вызова функции sorting на отсортированном списке (setof lst).
  8. (ssort '(1 2 3 2 -5 -2 0 3))
  9. (-5 -2 0 1 2 3) Вызывается функция ssort с аргументом (1 2 3 2 -5 -2 0 3). Результатом является отсортированный список без повторяющихся элементов (-5 -2 0 1 2 3), который выводится на экран.

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


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

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

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