Функция возвращает точечную пару элементами которой является: - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д