Получить из многоуровневого списка чисел списки положительных, отрицательных и число нулей. - Lisp

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

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

Написать функцию, которая по списку с подсписками строит списки из положительных числовых элементов, отрицательных числовых элементов и выводит количество нулевых элементов. Заранее спасибо! Если можно,напишите пожалуйста пояснение своих действий

Решение задачи: «Получить из многоуровневого списка чисел списки положительных, отрицательных и число нулей.»

textual
Листинг программы
(defun plus-minus-zero (w)
  (loop for a in (flatten w)
        if (plusp a) collect a into p
        else if (minusp a) collect a into m
        else count a into z
        finally return (values p m z)))
 
(defun flatten (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flatten (car w) (flat (cdr w) acc)))))
 
> (plus-minus-zero '(1 (2 3) 0 0 (((-4))) ((-6))))
(1 2 3)
(-4 -6)
2

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

В коде представлена функция plus-minus-zero, которая принимает в качестве аргумента список w и возвращает три списка: p — положительные числа, m — отрицательные числа, z — ноль. Функция flatten используется внутри функции plus-minus-zero для преобразования многоуровневого списка в одномерный. Функция flatten принимает в качестве аргумента список w и возвращает одномерный список. Код функции plus-minus-zero следующий:

  1. loop выполняет итерацию по каждому элементу списка w.
  2. Если элемент a является положительным числом, то он добавляется в список p.
  3. Если элемент a является отрицательным числом, то он добавляется в список m.
  4. Если элемент a равен нулю, то увеличивается счётчик z.
  5. В конце выполнения функции возвращаются значения списков p, m, z. Код функции flatten следующий:
  6. Если список w является null, то возвращается аккумулятор acc.
  7. Если элемент w является атомом, то он добавляется в аккумулятор acc.
  8. Если элемент w также является списком, то рекурсивно вызывается функция flatten для его внутреннего представления и результат добавляется в аккумулятор acc. В результате выполнения кода функции plus-minus-zero с аргументом '(1 (2 3) 0 0 (((-4))) ((-6))) будут возвращены следующие значения: (1 2 3) (-4 -6) 2.

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

9   голосов , оценка 4.333 из 5
Похожие ответы