Из списка чисел s создать новый список, меняя знак у каждого атома - Lisp
Формулировка задачи:
Всем привет!
есть задание: Определите функцию (f s), которая из списка чисел s создает новый список, меняя знак у каждого атома. Исходный список не предполагается одноуровневым.
Имеется собственно и решение:
нашел в просторах интернета, но не понимаю в нем ничего.
Можно ли сделать тоже самое с использованием функционала, но без решеток и ламбды?
Заранее благодарен!
(defun L (lst) (mapcar #'(lambda (x) (if (numberp x) (- x) (L x))) lst))
Решение задачи: «Из списка чисел s создать новый список, меняя знак у каждого атома»
textual
Листинг программы
(defun L (lst) (mapcar #'(lambda (x) (if (numberp x) (- x) (if (atom x) x (L x)))) lst)) ==> L (L '(1 2 3 d ((q 2 3 e)))) ==> (-1 -2 -3 d ((q -2 -3 e)))
Объяснение кода листинга программы
В коде определён встроенный функционал языка Lisp для работы с символами и списками. В функции L
используется функция mapcar
, которая применяет к каждому элементу списка lst
анонимную функцию. Анонимная функция проверяет каждый элемент списка на число с помощью функции numberp
. Если элемент является числом, то он меняет знак с помощью функции -
. Далее, если элемент является атомом, то он возвращается без изменений. Если элемент не является числом или атомом, то вызывается рекурсивный вызов функции L
для обработки этого элемента.
Примеры вызовов функции L
показывают, как она обрабатывает список '(1 2 3 d ((q 2 3 e)))
и возвращает новый список (-1 -2 -3 d ((q -2 -3 e)))
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д