Сортировка рекурсией и циклом - 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
. После завершения цикла, отсортированный список возвращается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д