Опpеделите функционал, аналогичный предикату MAPLIST для одноуровнего списка - Lisp
Формулировка задачи:
Решение задачи: «Опpеделите функционал, аналогичный предикату MAPLIST для одноуровнего списка»
(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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д