Поиск максимального и минимального значения списка - Lisp

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

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

Здравствуйте, разобрался, как найти для списка минимальное и соответственно максимальное значение, а как это можно сделать сразу за один проход списка? Видел решения такого, но делалось всегда с помощью циклов, можно ли без них обойтись?
(DEFUN MMIN (LST)
(COND ((NULL LST) NIL)
      ((NULL (CDR LST))(CAR LST)) 
      ((< (CAR LST)(CADR LST))(MMIN(CONS (CAR LST) (CDDR LST))))
      (T (MMIN(CDR LST)))))
(DEFUN MMAX (LST)
(COND ((NULL LST) NIL)
      ((NULL (CDR LST))(CAR LST)) 
      ((> (CAR LST)(CADR LST))(MMAX(CONS (CAR LST) (CDDR LST))))
      (T (MMAX(CDR LST)))))

Решение задачи: «Поиск максимального и минимального значения списка»

textual
Листинг программы
(defun min-max (lst &optional (min (car lst)) (max (car lst)))
  (cond ((null lst) (list min max))
        ((> (car lst) max) (min-max (cdr lst) min (car lst)))
        ((< (car lst) min) (min-max (cdr lst) (car lst) max))
        (t (min-max (cdr lst) min max))))
 
==> MIN-MAX
 
(min-max '(1 2 3 -5 3 8 0))
 
==> (-5 8)

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

В коде представлена функция min-max, которая принимает два аргумента: lst — список, элементы которого нужно сравнить, и два необязательных аргумента min и max — которые задают начальные значения минимального и максимального элемента списка. Если эти аргументы не заданы, то в качестве начального значения min используется первый элемент списка, а в качестве начального значения max — также первый элемент списка. Внутри функции используется конструкция cond, которая определяет четыре возможных варианта:

  1. Если список пуст, то возвращается список min и max.
  2. Если текущий элемент списка больше max, то рекурсивно вызывается функция min-max для оставшейся части списка с обновленным значением max, и результатом вызова функции является результат рекурсивного вызова.
  3. Если текущий элемент списка меньше min, то рекурсивно вызывается функция min-max для оставшейся части списка с обновленным значением min, и результатом вызова функции является результат рекурсивного вызова.
  4. Если текущий элемент списка не меньше и не больше min и max, то рекурсивно вызывается функция min-max для оставшейся части списка с текущими значениями min и max. В результате выполнения функции min-max для списка (1 2 3 -5 3 8 0) будет возвращен список -5 8, так как -5 является минимальным элементом списка, а 8 — максимальным.

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

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