Сортировка рекурсией и циклом - 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)

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

В коде представлено два варианта реализации функции сортировки, использующей рекурсию и цикл.

  1. Рекурсивный вариант: Функция vsort принимает на вход список lst и использует рекурсию для его сортировки. В случае, если список пуст, функция возвращает nil. В противном случае, функция находит минимальный элемент в списке с помощью функции min и удаляет его из списка с помощью функции removef. Затем функция рекурсивно вызывает саму себя с отсортированным списком без минимального элемента. Многократное применение этой операции позволяет получить отсортированный список.
  2. Циклический вариант: Функция vsort также принимает на вход список lst, но использует цикл для его сортировки. В этом варианте используется переменная r, которая инициализируется как nil, и переменная max, которая инициализируется как 0. Цикл выполняется до тех пор, пока список не станет пустым. На каждой итерации цикла находится максимальный элемент в списке с помощью функции max и добавляется в начало списка с помощью функции push. Затем переменная max обновляется, и из списка удаляется максимальный элемент с помощью функции removef. После завершения цикла, отсортированный список возвращается.

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


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

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

15   голосов , оценка 4 из 5