Определить количество подсписков, находящихся на указанном уровне заданного списка - Lisp

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

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

Определить количество подсписков, находящихся на указанном уровне для заданного списка
Листинг программы
  1. (defun lv-count (lst lv)
  2. (if (zerop lv)
  3. (count-if 'listp lst)
  4. (apply '+ (mapcar (lambda (x) (lv-count x (- lv 1))) (remove-if 'atom lst)))))
  5. ; (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 0)
  6. ; (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 1)
  7. ; (lv-count '(a (b (c 1) (33 d) d e) f ((2 (g)) 3)) 2)
  8. ; (lv-count '(a (b (c 1) ((h))d e) f ((2 (g)) 3)) 3)
  9. ; (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
Листинг программы
  1. (defun lv-count (lst lv)
  2.   (if (zerop lv)
  3.       (count-if 'listp lst)
  4.       (apply '+ (mapcar (lambda (x) (lv-count x (- lv 1))) (remove-if 'atom lst)))))
  5.  
  6. ==> lv-count
  7.  
  8. (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 0)
  9.  
  10. ==> 2
  11.  
  12. (lv-count '(a (b (c 1) d e) f ((2 (g)) 3)) 1)
  13.  
  14. ==> 2
  15.  
  16. (lv-count '(a (b (c 1) (33 d) d e) f ((2 (g)) 3)) 2)
  17.  
  18. ==> 1
  19.  
  20. (lv-count '(a (b (c 1) (33 d) d e) f ((2 (g)) 3)) 2)
  21.  
  22. ==> 1
  23.  
  24. (lv-count '(a (b (c 1) ((h))d e) f ((2 (g)) 3)) 3)
  25.  
  26. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы