Найти произведение элементов списка - Lisp

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

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

Необходимо найти произведение элементов в списке, имеющем вид: ((х (х)) (х (х)) (х (х)) ...) На данный момент имеется такой код, которые не выводит нужное значение:
(display "Редукция: ")
(define n 1)
(define  (sp1 x f)
  (if (null? x)
      n
      (and (f (car (car x))) (f (car (car (cdr (car x))))) (sp1 (cdr x) f))
      )
  )
(sp1 '((1 (2)) (3 (4)) (5 (6))) (lambda (x) (* x n)))
Подскажите, пожалуйста, как исправить

Решение задачи: «Найти произведение элементов списка»

textual
Листинг программы
(defun product-deep (w) (reduce #'*(flatten w)))
 
(defun flatten (w)
  (loop for a in w 
        if (and a (atom a)) collect a
        else nconc (flatten a)))
 
> (product-deep '((1 (2)) (3 (4)) (5 (6))))
720

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

В коде представлена функция product-deep, которая принимает один аргумент w. Внутри функции используется другая функция reduce с оператором *, которая применяет операцию умножения к элементам списка w. Функция flatten используется для преобразования списка w в одномерный список. Она использует цикл loop для итерации по элементам w. Если элемент является атомом, он добавляется в новый список. Если элемент является списком, то функция вызывает саму себя для этого элемента, чтобы продолжить процесс сглаживания списка. Таким образом, если передать в функцию product-deep список ((1 (2)) (3 (4)) (5 (6)), она будет последовательно обрабатывать каждый элемент списка. Сначала будет выполнено преобразование в одномерный список с помощью функции flatten, а затем будет выполнено умножение всех элементов с помощью функции reduce и оператора *. Результатом будет число 720.

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


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

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

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