Рекурсия, необходим совет - Lisp

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

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

Определите функцию, вычисляющую суммы положительных и отрицательных элементов одноуровневого числового списка. Решение должно быть составлено без использования функционалов и первоначальных элементов.

Решение задачи: «Рекурсия, необходим совет»

textual
Листинг программы
(defun summmp (w)
  (labels ((sum (v m p &aux (a (car v))) 
             (cond ((null v) (list m p))
                   ((minusp a) (sum (cdr v) (+ m a) p))
                   (t (sum (cdr v) m (+ p a))))))
    (sum w 0 0)))
 
> (summmp '(-3 -2 -1 0 1 2 3))
(-6 6)

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

В этом коде реализована рекурсивная функция summmp, которая принимает список w в качестве входного аргумента и возвращает два значения: сумму элементов списка и счётчик положительных элементов. В функции summmp создаётся вспомогательная функция sum, которая принимает три аргумента v, m и p. Переменная v содержит список, который нужно просуммировать, m — текущую сумму, а p — счётчик положительных элементов. В функции sum реализована рекурсия для обработки каждого элемента списка. Если список пуст, то возвращается текущая сумма и счётчик положительных элементов. Если текущий элемент меньше нуля, то вызывается рекурсия для обработки оставшейся части списка, а результат добавляется к текущей сумме и счётчику положительных элементов. Если текущий элемент больше или равен нулю, то вызывается рекурсия для обработки оставшейся части списка, а результат вычитается из текущей суммы и счётчика положительных элементов. В основной функции summmp создаётся список w, содержащий -3, -2, -1, 0, 1, 2 и 3. Затем вызывается функция sum с этим списком, начальной суммой 0 и начальным счётчиком 0. В результате работы функции summmp со списком w возвращается два значения: -6 и 6.

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

13   голосов , оценка 4.154 из 5