В произвольном списке (со вложенностью) все отрицательные элементы умножить на -2, все 0 заменить на (1 1) - Lisp
Формулировка задачи:
в произвольном списке (со вложенностью) все отрицательные элементы умножить на -2, все 0 заменить на (1 1).
например
(-1 1 0 2 -3) => (-2 1 (1 1)2 6)
(-1 (-1 (-1 0 1) 1) 2) => (2 (2 (2 (1 1) 1) 1) 2)
Решение задачи: «В произвольном списке (со вложенностью) все отрицательные элементы умножить на -2, все 0 заменить на (1 1)»
textual
Листинг программы
(defun change (w) (loop for a in w if (atom a) collect (cond ((minusp a) (* a -2)) ((zerop a) '(1 1)) (t a)) else collect (change a))) > (change '(-1 1 0 2 -3)) (2 1 (1 1) 2 6) > (change '(-1 (-1 (-1 0 1) 1) 2)) (2 (2 (2 (1 1) 1) 1) 2)
Объяснение кода листинга программы
В коде определён функцией change с одним аргументом w.
Внутри функции используется цикл loop, который выполняет следующие действия:
- Цикл проходит по каждому элементу списка
w. - Если элемент является атомом, то проверяется его значение:
— Если элемент отрицательный, то он умножается на -2.
— Если элемент равен 0, то он заменяется на
(1 1). — Во всех остальных случаях рекурсивно вызывается функцияchangeдля элемента. - Все остальные элементы списка собираются в новый список.
В конце функции возвращается полученный список.
Примеры вызовов функции
change: —change '(-1 1 0 2 -3)вернёт(2 1 (1 1) 2 6). —change '(-1 (-1 (-1 0 1) 1) 2)вернёт(2 (2 (2 (1 1) 1) 1) 2).