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

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

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

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

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

textual
Листинг программы
CL-USER> (defun max-elt (lst &optional (max (car lst)))
(cond ((null lst) max) ((> (car lst) max) (max-elt (cdr lst) (car lst))) (t (max-elt (cdr lst) max)))) 
MAX-ELT
CL-USER> (defun min-elt (lst &optional (min (car lst)))
 (cond ((null lst) min)
 ((< (car lst) min) (min-elt (cdr lst) (car lst)))
 (t (min-elt (cdr lst) min))))
MIN-ELT
CL-USER> (min-elt '(3 5 6))
3
CL-USER> (min-elt '(2 7 1 ))
1
CL-USER> (max-elt '(3 5 6))
6
CL-USER> (max-elt '(2 7 1 ))
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
Похожие ответы