Рекурсивная сортировка без повторяющихся элементов - 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)
Объяснение кода листинга программы
В коде представлена реализация рекурсивной функции сортировки без повторяющихся элементов.
- (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принимает на вход список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)). - (defun ssort (lst)
- (sorting (setof lst)))
Функция
ssortпринимает на вход списокlstи возвращает отсортированный список без повторяющихся элементов, полученный путем вызова функцииsortingна отсортированном списке(setof lst). - (ssort '(1 2 3 2 -5 -2 0 3))
- (-5 -2 0 1 2 3)
Вызывается функция
ssortс аргументом(1 2 3 2 -5 -2 0 3). Результатом является отсортированный список без повторяющихся элементов(-5 -2 0 1 2 3), который выводится на экран.