Опpеделите функционал, аналогичный предикату MAPLIST для одноуровнего списка - Lisp

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

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

Опpеделите функционал, аналогичный предикату MAPLIST для одноуровнего списка. (Используйте применяющий функционал FUNCALL).

Решение задачи: «Опpеделите функционал, аналогичный предикату MAPLIST для одноуровнего списка»

textual
Листинг программы
(defun maplist! (lst f)
  (cond ((null lst) nil)
        (t (cons (funcall f lst) (maplist! (cdr lst) f)))))
 
==> maplist!
 
(maplist! '(1 2 3 4) 'length)
 
==> (4 3 2 1)
 
(maplist! '(1 2 3 4 5 6 7 8 9 10) (lambda (x) (apply '* x)))
 
==> (3628800 3628800 1814400 604800 151200 30240 5040 720 90 10)

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

В коде определён функционал, аналогичный предикату MAPLIST для одноуровнего списка. Функция maplist! принимает два аргумента: lst — одноуровневый список, f — функционал, который будет применяться к каждому элементу списка. Если lst = nil, то возвращается nil. Если lst не равен nil, то: — из него удаляется последний элемент (cdr lst), так как мы работаем с одноуровневым списком; — к оставшемуся списку (lst) применяется функционал f; — полученный результат (funcall f lst) добавляется в начало нового списка; — новый список (cons (funcall f lst) (maplist! (cdr lst) f)) передаётся в следующую итерацию функции maplist!. В результате получается список, в котором каждый элемент обработан функционалом f. Например, для списка '(1 2 3 4) и функционала 'length получаем список (4 3 2 1), так как длина списка равна 4. А для списка '(1 2 3 4 5 6 7 8 9 10) и функционала (lambda (x) (apply '* x)) получаем список (3628800 3628800 1814400 604800 151200 30240 5040 720 90 10), так как умножаем каждый элемент на 10.

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


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

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

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