Найти сумму максимального числа из четных элементов и минимального числа из не четных элементов списка - Lisp
Формулировка задачи:
Дан список (a1, a2,…, aN). Вычислить значение выражения max(a2,a4,…)+min(a1,a3,…).Есть решение состоящее из трех функций.Помогите пожалуйста объединить все это в одну функцию.
(defun a (mylist) (cond ((null (cddr mylist))(car mylist)) ((min (car mylist) (a (cddr mylist)))) ;рекурсивный вызов функции а ) ) (defun b (mylist) (cond ((null (cdddr mylist)) (cadr mylist)) ((max (cadr mylist)(b (cdddr mylist)))) ) ) (defun f5 (mylist) (+ (a mylist) (b mylist)) )
Решение задачи: «Найти сумму максимального числа из четных элементов и минимального числа из не четных элементов списка»
textual
Листинг программы
(defun task (lst &optional (c 1) (min (car lst)) (max (cadr lst))) (cond ((null lst) (+ max min)) ((evenp c) (task (cdr lst) (+ c 1) min (max max (car lst)))) (t (task (cdr lst) (+ c 1) (min min (car lst)) max)))) ==> task (task '(10 2 3 4 5 60 7)) ==> 63 (defun task (lst) (let* ((mix (mapcar 'list lst (range 1 (length lst)))) (odd (remove-if-not #'(lambda (x) (oddp (cadr x))) mix)) (evn (remove-if-not #'(lambda (x) (evenp (cadr x))) mix)) (max (apply 'max (mapcar 'car evn))) (min (apply 'min (mapcar 'car odd)))) (+ min max))) ==> task (task '(10 2 3 4 5 60 7)) ==> 63
Объяснение кода листинга программы
Код решает задачу поиска суммы максимального числа из четных элементов и минимального числа из нечетных элементов списка. В первом варианте кода:
- Создается функция
task
, которая принимает списокlst
и опциональные аргументыc
,min
иmax
. - В первом условии проверки (
(null lst)
) решается задача, если список пустой, то возвращается суммаmax
иmin
. - Во втором условии проверки (
(evenp c)
) решается задача, если текущий элементc
четный, то рекурсивно вызывается функцияtask
для спискаcdr lst
, увеличивается счетчикc
на 1, и передаются значенияmin
иmax
в качестве аргументов. - В третьем условии проверки (
(t)
) решается задача, если текущий элементc
нечетный, то рекурсивно вызывается функцияtask
для спискаcdr lst
, увеличивается счетчикc
на 1, и передаются значенияmin
иmax
в качестве аргументов. Во втором варианте кода: - Создается функция
task
, которая принимает списокlst
. - В первом условии проверки (
(null lst)
) решается задача, если список пустой, то возвращается суммаmax
иmin
. - Создаются два новых списка:
mix
— список четных и нечетных элементов спискаlst
, иodd
— список нечетных элементов. - Создается список
evn
— список четных элементов. - Находится максимальное значение в списке
evn
с помощью функцииmax
. - Находится минимальное значение в списке
odd
с помощью функцииmin
. - Возвращается сумма
min
иmax
. Оба варианта кода выполняют одну и ту же задачу, но с разной структурой. Первый вариант кода использует рекурсию, а второй вариант кода использует циклы и функции для обработки списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д