Поиск максимального и минимального значения списка - 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
, которая определяет четыре возможных варианта:
- Если список пуст, то возвращается список min и max.
- Если текущий элемент списка больше max, то рекурсивно вызывается функция
min-max
для оставшейся части списка с обновленным значением max, и результатом вызова функции является результат рекурсивного вызова. - Если текущий элемент списка меньше min, то рекурсивно вызывается функция
min-max
для оставшейся части списка с обновленным значением min, и результатом вызова функции является результат рекурсивного вызова. - Если текущий элемент списка не меньше и не больше min и max, то рекурсивно вызывается функция
min-max
для оставшейся части списка с текущими значениями min и max. В результате выполнения функцииmin-max
для списка(1 2 3 -5 3 8 0)
будет возвращен список-5 8
, так как -5 является минимальным элементом списка, а 8 — максимальным.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д