Максимальное произведение трех чисел списка - Lisp

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

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

Дан список целых чисел. Определить функцию, возвращающую самое большое произведение трех чисел из этого списка.

Решение задачи: «Максимальное произведение трех чисел списка»

textual
Листинг программы
(defun del1 (a x)
 (if (= a (car x))
  (cdr x)
  (cons (car x) (del1 a (cdr x)))
 )
)
 
(defun maxmul (x &aux (a1 (apply 'max x)) a2 value y)
 (if (< (length x) 3)
  nil
  (progn
   (setq x (del1 a1 x))
   (setq y x)
   (setq value
    (*
     a1
     (setq a2 (apply 'max x))
     (apply 'max (del1 a2 x))
    )
   )
   (max
    value
    (*
     a1
     (setq a2 (apply 'min y))
     (apply 'min (del1 a2 y))
    )
   )
  )
 )
)
 
(maxmul '(1 2 3 4 5))
 
==> 60
(maxmul '(1 2 3 4 -5))
 
==> 24
(maxmul '(1 2 3 -4 -5))
 
==> 60
(maxmul '(1 2 -3))
 
==> -6
(maxmul '(1 2))
 
==> NIL

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

В первом случае, мы имеем дело с рекурсивной функцией, которая принимает три аргумента: a, x и y. Первый аргумент a — это текущий максимум, второй аргумент x — это список чисел, который нужно обработать, а третий аргумент y — это результат, который мы получаем на данный момент. Функция del1 используется для рекурсивного удаления первого элемента из списка x, если он равен a. Если это не так, то первый элемент списка x добавляется обратно в список y. Эта функция вызывается рекурсивно до тех пор, пока список x не станет пустым или не будет состоять только из одного элемента. Функция maxmul используется для нахождения максимального произведения трех чисел в списке x. Сначала мы находим максимальное значение в списке x с помощью функции apply и присваиваем его переменной a1. Затем мы вызываем функцию del1 с аргументами a1 и x, чтобы удалить первый элемент из списка x и присваиваем результат переменной y. Затем мы находим максимальное значение в списке y с помощью функции apply и присваиваем его переменной a2. После этого мы снова вызываем функцию del1 с аргументами a2 и y, чтобы удалить первый элемент из списка y и присваиваем результат переменной y. Затем мы находим максимальное значение из трех чисел a1, a2 и y с помощью функции apply и присваиваем его переменной value. Если длина списка x меньше трех, то мы возвращаем nil. В противном случае, мы присваиваем значение переменной value максимальному произведению трех чисел a1, a2 и y. Во втором случае, мы передаем список '(1 2 3 4 -5) в функцию maxmul. Функция maxmul вызывает функцию del1 и находит максимальное значение в списке x, которое равно 6. Затем она находит максимальное значение из трех чисел 6, 6 и -5, которое равно 6. В результате мы получаем значение 60. В третьем случае, мы передаем список '(1 2 3 -4 -5) в функцию maxmul. Функция maxmul вызывает функцию del1 и находит максимальное значение в списке x, которое равно -4. Затем она находит максимальное значение из трех чисел -4, -4 и -5, которое равно -4. В результате мы получаем значение 60. В четвертом случае, мы передаем список '(1 2 -3) в функцию maxmul. Функция maxmul вызывает функцию del1 и находит максимальное значение в списке x, которое равно -3. Затем она находит максимальное значение из трех чисел -3, -3 и -3, которое равно -3. В результате мы получаем значение -6. В пятом случае, мы передаем список '(1 2) в функцию maxmul. Функция maxmul вызывает функцию del1 и находит максимальное значение в списке x, которое равно пустому списку. Затем она находит максимальное значение из трех чисел пустого списка, пустого списка и пустого списка, которое также равно пустому списку. В результате мы получаем значение nil.

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

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