Найти произведение элементов списка - 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)))Решение задачи: «Найти произведение элементов списка»
(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.