Функция возвращает точечную пару элементами которой является: - Lisp

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

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

функция возвращает точечную пару элементами которой является: 1.) произведение всех положительных чисел произвольную списка. 2.) количество положительных чисел произвольную списка. пример: (2 -1 3 (3 -1)) -> (18.3)

Решение задачи: «Функция возвращает точечную пару элементами которой является:»

textual
Листинг программы
  1. (defun task (lst)
  2.   (reduce #'(lambda (acc x) (cond ((listp x)
  3.                                    (let* ((tmp (task x))
  4.                                           (p (car tmp))
  5.                                           (s (cdr tmp)))  
  6.                                          (cons (* (car acc) p) (+ (cdr acc) s))))
  7.                                   ((plusp x) (cons (* x (car acc)) (+ 1 (cdr acc))))
  8.                                   (t acc))) lst :initial-value (cons 1 0)))
  9.  
  10. ==> task
  11. (task '(2 -1 3))
  12.  
  13. ==> (6 . 2)
  14.  
  15. (task '(2 -1 3 (3 -1)))
  16.  
  17. ==> (18 . 3)

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

В данном коде определена функция task, которая принимает в качестве аргумента список lst. Функция применяет рекурсивно к каждому элементу списка lst следующую логику:

  1. Если элемент является списком, то рекурсивно вызывается функция task для этого элемента, сохраняя результат в переменную tmp.
  2. Затем из tmp извлекаются два значения: p и s.
  3. Если элемент не является списком, то проверяется его тип с помощью функции plusp.
  4. Если элемент является числом, то выполняется операция умножения на car acc и прибавления единицы к cdr acc.
  5. Результатом работы функции task является список, состоящий из двух элементов — произведения и суммы, сохранённых в acc.
  6. Значение lst при инициализации функции task равно (cons 1 0).
  7. При первом вызове функции task для списка lst результат будет (6 . 2), так как car lst равен 2, а cdr lst равен 0.
  8. При втором вызове функции task для списка lst результат будет (18 . 3), так как car lst равен 2, cdr lst равен -1, следующий элемент списка имеет тип числа и приведённый к числу результат равен 3, а acc содержит 6 и 2.

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


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

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

11   голосов , оценка 3.636 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы