Сортировка рекурсией и циклом - Lisp
Формулировка задачи:
Определить функцию сортировки числового списка с выбором максимального элемента
Решение задачи: «Сортировка рекурсией и циклом»
textual
Листинг программы
;; рекурсия (defun vsort (lst) (cond ((null lst) nil) (t (let ((min (apply 'min lst))) (cons min (vsort (removef min lst))))))) ==> VSORT (vsort '(1 2 3 1 2 3 1 2 3)) ==> (1 1 1 2 2 2 3 3 3) ;; цикл (defun vsort (lst) (let ((r nil) (max 0)) (loop (when (null lst) (return r)) (setq max (apply 'max lst)) (push max r) (setq lst (removef max lst))))) ==> VSORT (vsort '(1 2 3 1 2 3 1 2 3)) ==> (1 1 1 2 2 2 3 3 3)
Объяснение кода листинга программы
В коде представлено два варианта реализации функции сортировки, использующей рекурсию и цикл.
- Рекурсивный вариант:
Функция
vsortпринимает на вход списокlstи использует рекурсию для его сортировки. В случае, если список пуст, функция возвращаетnil. В противном случае, функция находит минимальный элемент в списке с помощью функцииminи удаляет его из списка с помощью функцииremovef. Затем функция рекурсивно вызывает саму себя с отсортированным списком без минимального элемента. Многократное применение этой операции позволяет получить отсортированный список. - Циклический вариант:
Функция
vsortтакже принимает на вход списокlst, но использует цикл для его сортировки. В этом варианте используется переменнаяr, которая инициализируется какnil, и переменнаяmax, которая инициализируется как 0. Цикл выполняется до тех пор, пока список не станет пустым. На каждой итерации цикла находится максимальный элемент в списке с помощью функцииmaxи добавляется в начало списка с помощью функцииpush. Затем переменнаяmaxобновляется, и из списка удаляется максимальный элемент с помощью функцииremovef. После завершения цикла, отсортированный список возвращается.