Определить количество подсписков, находящихся на указанном уровне заданного списка - Lisp
Формулировка задачи:
(defun lv-count (lst lv) (if (zerop lv) (count-if 'listp lst) (apply '+ (mapcar (lambda (x) (lv-count x (- lv 1))) (remove-if 'atom lst))))) ; (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 0) ; (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 1) ; (lv-count '(a (b (c 1) (33 d) d e) f ((2 (g)) 3)) 2) ; (lv-count '(a (b (c 1) ((h))d e) f ((2 (g)) 3)) 3) ; (load "E:\\lv-count.lisp")
Решение задачи: «Определить количество подсписков, находящихся на указанном уровне заданного списка»
(defun lv-count (lst lv) (if (zerop lv) (count-if 'listp lst) (apply '+ (mapcar (lambda (x) (lv-count x (- lv 1))) (remove-if 'atom lst))))) ==> lv-count (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 0) ==> 2 (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 1) ==> 2 (lv-count '(a (b (c 1) (33 d) d e) f ((2 (g)) 3)) 2) ==> 1 (lv-count '(a (b (c 1) (33 d) d e) f ((2 (g)) 3)) 2) ==> 1 (lv-count '(a (b (c 1) ((h))d e) f ((2 (g)) 3)) 3) ==> 0
Объяснение кода листинга программы
В коде определён функционал для подсчёта количества подсписков на указанном уровне заданного списка. Список (или строка) может быть представлен как стек, что позволяет нам применить рекурсию для обхода каждого элемента. В коде используются следующие функции: — count-if — принимает два аргумента: функцию-тест и список. Выполняет рекурсивное обследование списка с помощью встроенной функции apply, что позволяет нам применять функцию-тест к каждому элементу списка. Если тест истина, увеличивает счётчик на единицу. — mapcar — выполняет рекурсивную карму (то есть отображает результат применения функции к каждому элементу списка). — remove-if — рекурсивно удаляет элементы списка, которые удовлетворяют заданному условию (тесту). — apply — применяет функцию к списку аргументов. — lambda — определяет анонимную функцию. — zerop — проверяет, равно ли значение аргумента нулю. — + — выполняет операцию сложения. — * — выполняет операцию умножения. — > — выполняет операцию сравнения и возвращает результат в виде логического значения. — = — выполняет операцию сравнения и возвращает результат в виде логического значения. — g — обращение к значению по ссылке. — f — обращение к значению по ссылке. — a — обращение к значению по ссылке. — b — обращение к значению по ссылке. — c — обращение к значению по ссылке. — d — обращение к значению по ссылке. — e — обращение к значению по ссылке. — h — обращение к значению по ссылке. — g — обращение к значению по ссылке. — i — обращение к значению по ссылке. — j — обращение к значению по ссылке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д