Поиск максимального и минимального значения списка - 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 — максимальным.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д