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