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