В произвольном списке (со вложенностью) все отрицательные элементы умножить на -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, который выполняет следующие действия:

  1. Цикл проходит по каждому элементу списка w.
  2. Если элемент является атомом, то проверяется его значение: — Если элемент отрицательный, то он умножается на -2. — Если элемент равен 0, то он заменяется на (1 1). — Во всех остальных случаях рекурсивно вызывается функция change для элемента.
  3. Все остальные элементы списка собираются в новый список. В конце функции возвращается полученный список. Примеры вызовов функции 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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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