Рекурсивная функция, для работы со списками - Lisp

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

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

Доброе время суток. Вообщем имеется два списка, из них нужно найти минимальный и максимальный элемент, а после посчитать по формуле значения (с этим я справлюсь), проблема в том, что обязательным условием является то, чтобы в программе была рекурсивная функция. Я решил пусть это будет нахождение третьего минимального и максимального элемента. Вот что написал:
Листинг программы
  1. (set 'list1 ( list 3 5 6)) ; задаем два списка
  2. (set 'list2 ( list 2 7 1))
  3. (defun max1(a b) ; функция нахождения максимального из первых элементов списков
  4. (max (car a) (car b)))
  5. (defun min1(a b) ; функция нахождения минимального из первых элементов списков
  6. (min (car a) (car b)))
  7. (set 'minim1(min1 list1 list2)) ; присваиваем с1 минимальное значения из первых элементов списка
  8. (set 'maxi1(max1 list1 list2)) ; присваиваем с1 максимальное значения из первых элементов списка
  9. (set 'c1(+ (* 0.4 minim1) (* 0.6 maxi1))) { Получаем С1}
  10. (defun max2(a b) ;ф-я нахождения максимального из вторых элементов
  11. (min1 (cdr a) (cdr b)))
  12. (defun min2(a b) ;ф-я нахождения минимального из вторых элементов
  13. (min1 (cdr a) (cdr b)))
  14. (set 'minim2(min2 list1 list2)) ; присваиваем с1 минимальное значения из первых элементов списка
  15. (set 'maxi2(max2 list1 list2)) ; присваиваем с1 максимальное значения из первых элементов списка
  16. (set 'c2(+ (* 0.4 minim2) (* 0.6 maxi2))) { Получаем С2}
а дальше не знаю, нужно найти минимальный и максимальный из третьих элементов списка.... Помогите пожалуйста.

Решение задачи: «Рекурсивная функция, для работы со списками»

textual
Листинг программы
  1. CL-USER> (defun max-elt (lst &optional (max (car lst)))
  2. (cond ((null lst) max) ((> (car lst) max) (max-elt (cdr lst) (car lst))) (t (max-elt (cdr lst) max))))
  3. MAX-ELT
  4. CL-USER> (defun min-elt (lst &optional (min (car lst)))
  5.  (cond ((null lst) min)
  6.  ((< (car lst) min) (min-elt (cdr lst) (car lst)))
  7.  (t (min-elt (cdr lst) min))))
  8. MIN-ELT
  9. CL-USER> (min-elt '(3 5 6))
  10. 3
  11. CL-USER> (min-elt '(2 7 1 ))
  12. 1
  13. CL-USER> (max-elt '(3 5 6))
  14. 6
  15. CL-USER> (max-elt '(2 7 1 ))
  16. 7

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

Код представляет собой две рекурсивные функции, max-elt и min-elt, для поиска максимального и минимального элементов в списке соответственно. Вот что делает каждая функция:

  1. max-elt:
    • Если список пуст, возвращает первый элемент, переданный в функцию (по умолчанию это будет ноль).
    • Если текущий элемент больше первого, то рекурсивно вызывает функцию max-elt для оставшейся части списка, передавая в нее текущий элемент.
    • В остальных случаях рекурсивно вызывает функцию max-elt для оставшейся части списка, передавая в нее ноль.
  2. 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 ).

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


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

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

15   голосов , оценка 4.067 из 5

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

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

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