Функция поиска третьего по величине элемента списка - Lisp

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

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

Здравствуйте! Знаю как найти максимальный элемент списка, но в силу своего недавнего знакомства с LISPом, не получается переделать данную функцию под поиск именно третьего по величине элемента списка. Поделитесь, пожалуйста, кодом решения этой задачки. Заранее благодарю за помощь.
(defun F (L)
 (cond
  ((null L) nil) ; если список пуст - возвращается nil
  ((null (cdr L)) (car L)) ; если в списке <уже> один элемент - возвращается этот элемент
  ((> (car L) (cadr L)) (F (cons (car L) (cddr L)))) ; если <очередной> первый элемент больше второго - функция рекурсивно вызывается для списка с исключенным вторым элементом
  (T (F (cdr L))))) ; в противном случае - функция рекурсивно вызывается для списка с исключенным первым элементом

Решение задачи: «Функция поиска третьего по величине элемента списка»

textual
Листинг программы
(defun 3-max (lst &optional (m1 nil) (m2 nil) (m3 nil))
  (cond ((null lst) (list m1 m2 m3))
        ((null m1) (3-max (cdr lst) (car lst) m2 m3))
        ((null m2) (if (< (car lst) m1) 
                       (3-max (cdr lst) m1 (car lst) m3)
                       (3-max (cdr lst) (car lst) m1 m2))) 
        ((null m3) (if (< (car lst) m2)
                       (3-max (cdr lst) m1 m2 (car lst))
                       (3-max (cdr lst) m1 (car lst) m2)))
        ((> (car lst) m1) (3-max (cdr lst) (car lst) m1 m2))
        ((> (car lst) m2) (3-max (cdr lst) m1 (car lst) m2))
        ((> (car lst) m3) (3-max (cdr lst) m1 m2 (car lst)))
        (t (3-max (cdr lst) m1 m2 m3))))
     
 
==> 3-max
 
(3-max '(1 2 -4 2 8 7 12 6))
 
==> (12 8 7)

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

В этом коде определена функция 3-max, которая ищет третий элемент в списке с максимальным значением. Список '(1 2 -4 2 8 7 12 6) содержит восемь элементов. Согласно коду, функция 3-max ищет третий элемент с максимальным значением. На первом шаге, функция проверяет, является ли список пустым. Если это так, то возвращается пустой список (m1 m2 m3). Если список не пустой, функция проверяет, есть ли уже найденные максимальные значения для первых трех элементов. Если максимальные значения еще не найдены, то функция рекурсивно вызывается для оставшейся части списка, чтобы найти третий элемент с максимальным значением. Если список пустой, то возвращается значение, найденное на предыдущем шаге. Если список не пустой, то функция продолжает поиск третьего элемента с максимальным значением. В данном случае, функция 3-max находит третий элемент с максимальным значением в списке '(1 2 -4 2 8 7 12 6), который равен 12, и возвращает список (12 8 7).

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


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

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

14   голосов , оценка 3.786 из 5
Похожие ответы