Найти сумму максимального числа из четных элементов и минимального числа из не четных элементов списка - 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

Объяснение кода листинга программы

Код решает задачу поиска суммы максимального числа из четных элементов и минимального числа из нечетных элементов списка. В первом варианте кода:

  1. Создается функция task, которая принимает список lst и опциональные аргументы c, min и max.
  2. В первом условии проверки ((null lst)) решается задача, если список пустой, то возвращается сумма max и min.
  3. Во втором условии проверки ((evenp c)) решается задача, если текущий элемент c четный, то рекурсивно вызывается функция task для списка cdr lst, увеличивается счетчик c на 1, и передаются значения min и max в качестве аргументов.
  4. В третьем условии проверки ((t)) решается задача, если текущий элемент c нечетный, то рекурсивно вызывается функция task для списка cdr lst, увеличивается счетчик c на 1, и передаются значения min и max в качестве аргументов. Во втором варианте кода:
  5. Создается функция task, которая принимает список lst.
  6. В первом условии проверки ((null lst)) решается задача, если список пустой, то возвращается сумма max и min.
  7. Создаются два новых списка: mix — список четных и нечетных элементов списка lst, и odd — список нечетных элементов.
  8. Создается список evn — список четных элементов.
  9. Находится максимальное значение в списке evn с помощью функции max.
  10. Находится минимальное значение в списке odd с помощью функции min.
  11. Возвращается сумма min и max. Оба варианта кода выполняют одну и ту же задачу, но с разной структурой. Первый вариант кода использует рекурсию, а второй вариант кода использует циклы и функции для обработки списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы