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