Определить количество подсписков, находящихся на указанном уровне заданного списка - 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")
помогите разобраться выдает неверные подсчеты ответы: ; (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 0) ;1 ; (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) ;3 ; (lv-count '(a (b (c 1) ((h))d e) f ((2 (g)) 3)) 3) ;2

Решение задачи: «Определить количество подсписков, находящихся на указанном уровне заданного списка»

textual
Листинг программы
(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 — обращение к значению по ссылке.

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


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

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

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