Рекурсивная функция, для работы со списками - Lisp
Формулировка задачи:
Доброе время суток.
Вообщем имеется два списка, из них нужно найти минимальный и максимальный элемент, а после посчитать по формуле значения (с этим я справлюсь), проблема в том, что обязательным условием является то, чтобы в программе была рекурсивная функция.
Я решил пусть это будет нахождение третьего минимального и максимального элемента.
Вот что написал:
а дальше не знаю, нужно найти минимальный и максимальный из третьих элементов списка....
Помогите пожалуйста.
(set 'list1 ( list 3 5 6)) ; задаем два списка
(set 'list2 ( list 2 7 1))
(defun max1(a b) ; функция нахождения максимального из первых элементов списков
(max (car a) (car b)))
(defun min1(a b) ; функция нахождения минимального из первых элементов списков
(min (car a) (car b)))
(set 'minim1(min1 list1 list2)) ; присваиваем с1 минимальное значения из первых элементов списка
(set 'maxi1(max1 list1 list2)) ; присваиваем с1 максимальное значения из первых элементов списка
(set 'c1(+ (* 0.4 minim1) (* 0.6 maxi1))) { Получаем С1}
(defun max2(a b) ;ф-я нахождения максимального из вторых элементов
(min1 (cdr a) (cdr b)))
(defun min2(a b) ;ф-я нахождения минимального из вторых элементов
(min1 (cdr a) (cdr b)))
(set 'minim2(min2 list1 list2)) ; присваиваем с1 минимальное значения из первых элементов списка
(set 'maxi2(max2 list1 list2)) ; присваиваем с1 максимальное значения из первых элементов списка
(set 'c2(+ (* 0.4 minim2) (* 0.6 maxi2))) { Получаем С2}Решение задачи: «Рекурсивная функция, для работы со списками»
textual
Листинг программы
CL-USER> (defun max-elt (lst &optional (max (car lst))) (cond ((null lst) max) ((> (car lst) max) (max-elt (cdr lst) (car lst))) (t (max-elt (cdr lst) max)))) MAX-ELT CL-USER> (defun min-elt (lst &optional (min (car lst))) (cond ((null lst) min) ((< (car lst) min) (min-elt (cdr lst) (car lst))) (t (min-elt (cdr lst) min)))) MIN-ELT CL-USER> (min-elt '(3 5 6)) 3 CL-USER> (min-elt '(2 7 1 )) 1 CL-USER> (max-elt '(3 5 6)) 6 CL-USER> (max-elt '(2 7 1 )) 7
Объяснение кода листинга программы
Код представляет собой две рекурсивные функции, max-elt и min-elt, для поиска максимального и минимального элементов в списке соответственно.
Вот что делает каждая функция:
max-elt:- Если список пуст, возвращает первый элемент, переданный в функцию (по умолчанию это будет ноль).
- Если текущий элемент больше первого, то рекурсивно вызывает функцию
max-eltдля оставшейся части списка, передавая в нее текущий элемент. - В остальных случаях рекурсивно вызывает функцию
max-eltдля оставшейся части списка, передавая в нее ноль.
min-elt:- Если список пуст, возвращает первый элемент, переданный в функцию (по умолчанию это будет ноль).
- Если текущий элемент меньше первого, то рекурсивно вызывает функцию
min-eltдля оставшейся части списка, передавая в нее текущий элемент. - В остальных случаях рекурсивно вызывает функцию
min-eltдля оставшейся части списка, передавая в нее ноль. Примеры использования функций: (min-elt '(3 5 6)))вернет3, потому что это минимальный элемент в списке(3 5 6).(max-elt '(3 5 6)))вернет6, потому что это максимальный элемент в списке(3 5 6).(min-elt '(2 7 1 )))вернет1, потому что это минимальный элемент в списке(2 7 1 ).(max-elt '(2 7 1 )))вернет7, потому что это максимальный элемент в списке(2 7 1 ).