Функция возвращает точечную пару элементами которой является: - Lisp
Формулировка задачи:
функция возвращает точечную пару элементами которой является:
1.) произведение всех положительных чисел произвольную списка.
2.) количество положительных чисел произвольную списка.
пример: (2 -1 3 (3 -1)) -> (18.3)
Решение задачи: «Функция возвращает точечную пару элементами которой является:»
textual
Листинг программы
(defun task (lst) (reduce #'(lambda (acc x) (cond ((listp x) (let* ((tmp (task x)) (p (car tmp)) (s (cdr tmp))) (cons (* (car acc) p) (+ (cdr acc) s)))) ((plusp x) (cons (* x (car acc)) (+ 1 (cdr acc)))) (t acc))) lst :initial-value (cons 1 0))) ==> task (task '(2 -1 3)) ==> (6 . 2) (task '(2 -1 3 (3 -1))) ==> (18 . 3)
Объяснение кода листинга программы
В данном коде определена функция task, которая принимает в качестве аргумента список lst.
Функция применяет рекурсивно к каждому элементу списка lst следующую логику:
- Если элемент является списком, то рекурсивно вызывается функция
taskдля этого элемента, сохраняя результат в переменнуюtmp. - Затем из
tmpизвлекаются два значения:pиs. - Если элемент не является списком, то проверяется его тип с помощью функции
plusp. - Если элемент является числом, то выполняется операция умножения на
car accи прибавления единицы кcdr acc. - Результатом работы функции
taskявляется список, состоящий из двух элементов — произведения и суммы, сохранённых вacc. - Значение
lstпри инициализации функцииtaskравно(cons 1 0). - При первом вызове функции
taskдля спискаlstрезультат будет(6 . 2), так какcar lstравен 2, аcdr lstравен 0. - При втором вызове функции
taskдля спискаlstрезультат будет(18 . 3), так какcar lstравен 2,cdr lstравен -1, следующий элемент списка имеет тип числа и приведённый к числу результат равен 3, аaccсодержит 6 и 2.