Найти сумму максимального числа из четных элементов и минимального числа из не четных элементов списка - Lisp

Узнай цену своей работы

Формулировка задачи:

Дан список (a1, a2,…, aN). Вычислить значение выражения max(a2,a4,…)+min(a1,a3,…).Есть решение состоящее из трех функций.Помогите пожалуйста объединить все это в одну функцию.
Листинг программы
  1. (defun a (mylist)
  2. (cond
  3. ((null (cddr mylist))(car mylist))
  4. ((min (car mylist) (a (cddr mylist)))) ;рекурсивный вызов функции а
  5. )
  6. )
  7. (defun b (mylist)
  8. (cond
  9. ((null (cdddr mylist)) (cadr mylist))
  10. ((max (cadr mylist)(b (cdddr mylist))))
  11. )
  12. )
  13. (defun f5 (mylist)
  14. (+ (a mylist) (b mylist))
  15. )

Решение задачи: «Найти сумму максимального числа из четных элементов и минимального числа из не четных элементов списка»

textual
Листинг программы
  1. (defun task (lst &optional (c 1) (min (car lst)) (max (cadr lst)))
  2.    (cond ((null lst) (+ max min))
  3.          ((evenp c) (task (cdr lst) (+ c 1) min (max max (car lst))))
  4.          (t (task (cdr lst) (+ c 1) (min min (car lst)) max))))
  5.  
  6. ==> task
  7.  
  8. (task '(10 2 3 4 5 60 7))
  9.  
  10. ==> 63
  11.  
  12. (defun task (lst)
  13.   (let* ((mix (mapcar 'list lst (range 1 (length lst))))
  14.          (odd (remove-if-not #'(lambda (x) (oddp (cadr x))) mix))
  15.          (evn (remove-if-not #'(lambda (x) (evenp (cadr x))) mix))
  16.          (max (apply 'max (mapcar 'car evn)))
  17.          (min (apply 'min (mapcar 'car odd))))
  18.      (+ min max)))
  19.  
  20. ==> task
  21.  
  22. (task '(10 2 3 4 5 60 7))
  23.  
  24. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы