Реализовать функционал, который выполняет заданную функцию над всеми элементами списков вида (x1(x2(.)(x3)(.)(.) - Lisp

Узнай цену своей работы

Формулировка задачи:

Реализовать функционал, который выполняет заданную функцию над всеми элементами списков вида (x1(x2(...)(x3)(...)(...))) Подскажите, что тут надо сделать? Непонятна суть задачи, а уж как делать..

Решение задачи: «Реализовать функционал, который выполняет заданную функцию над всеми элементами списков вида (x1(x2(.)(x3)(.)(.)»

textual
Листинг программы
(defun uMap (lst f)
  (mapcar (lambda (x) (if (atom x) (funcall f x) (uMap x f))) lst))
 
==> UMAP
 
(umap '(1 (2 (3 (4)))) (lambda (x) (+ x 5)))
 
==> (6 (7 (8 (9))))
 
(uMap '("asd" ("qwe" ("rty" "uu") ((("vbn"))))) 'strRev)
 
==> ("dsa" ("ewq" ("ytr" "uu") ((("nbv")))))
 
(uMap '(1 (2 (3 (4)))) (lambda (x) (/ 1 x)))
 
==> (1 (1/2 (1/3 (1/4))))

Объяснение кода листинга программы

Функция uMap принимает два аргумента: lst и f. Алгоритм работы функции следующий:

  1. mapcar применяет функцию f к каждому элементу списка lst.
  2. Если элемент является атомом, то funcall вызывает функцию f с этим элементом в качестве аргумента.
  3. Если элемент является списком, то рекурсивно вызывается функция uMap с этим элементом и функцией f в качестве аргументов.
  4. Результатом работы функции uMap является список, в котором каждый элемент обработан с помощью функции f. Например, для списка lst = (1 (2 (3 (4))) и функции f = (lambda (x) (+ x 5)) результатом будет (6 (7 (8 (9))) — каждый элемент списка lst был увеличен на 5 с помощью функции f. Для списка lst =asd(qwe(rty`uu) (((vbn)))и функцииf = (lambda (x) (strRev x))результатом будет ``dsa (ewq (ytr uu) (((nbv)))— каждый элемент спискаlstбыл перевернут с помощью функцииf. Для спискаlst = (1 (2 (3 (4))))и функцииf = (lambda (x) (/ 1 x))результатом будет(1 (1/2 (1/3 (1/4))))— каждый элемент спискаlstбыл разделен на 1 с помощью функцииf`.

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

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