Сортировка рекурсией и циклом - Lisp

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

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

Определить функцию сортировки числового списка с выбором максимального элемента

Решение задачи: «Сортировка рекурсией и циклом»

textual
Листинг программы
  1. ;; рекурсия
  2.  
  3. (defun vsort (lst)
  4.   (cond ((null lst) nil)
  5.         (t (let ((min (apply 'min lst)))
  6.              (cons min (vsort (removef min lst)))))))
  7.                  
  8.  
  9. ==> VSORT
  10.  
  11. (vsort '(1 2 3 1 2 3 1 2 3))
  12.  
  13. ==> (1 1 1 2 2 2 3 3 3)
  14.  
  15. ;; цикл
  16.  
  17. (defun vsort (lst)
  18.   (let ((r nil) (max 0))
  19.     (loop
  20.        (when (null lst) (return r))
  21.        (setq max (apply 'max lst))
  22.        (push max r)
  23.        (setq lst (removef max lst)))))  
  24.  
  25. ==> VSORT
  26.  
  27. (vsort '(1 2 3 1 2 3 1 2 3))
  28.  
  29. ==> (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут