В произвольном списке (со вложенностью) все отрицательные элементы умножить на -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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д