Удаление из списка, вложенного списка - Lisp

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

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

Написать программу выделения списков на заданном уровне и удаления заданного их количества в произвольном введенном исходном списке. Исходный список имеет уровень 0, вложенный в него список имеет уровень 1 и т.д. Пример. Пусть имя программы p1, допустим, набрали исходный список:
Листинг программы
  1. ( a (b (c 1)d e) f ( (2 (g ) ) 3) ).
  2. 1 2 3 2 1 2 3 4 3 2 1 0
Тогда при обращении к программе (p1 '(a(b(c 1)d e)f((2(g))3)) 1 1) она выведет на экран сообщение “Измененный исходный список (a f ((2(g)) 3))”. При обращении к программе (p1 '(a(b(c 1)d e)f((2(g))3)) 2 2) она выведет на экран сообщение “ Измененный исходный список (a(b d e)f( 3 ))”. При обращении к программе (p1 '(a(b(c 1)d e)f((2(g))3)) 3 1) она выведет на экран сообщение “ Измененный исходный список (a(b(c 1)d e)f((2)3))”. Помогите пжл.

Решение задачи: «Удаление из списка, вложенного списка»

textual
Листинг программы
  1. ;; Вспомогательная функция подсчета сколько можно удалить из головы списка
  2.  
  3. (defun count-in-head (lst lv)
  4.   (cond ((null lst) 0)
  5.         ((and (listp (car lst)) (= lv 1)) (+ 1 (count-in-head (cdr lst) lv)))
  6.         ((listp (car lst)) (+ (count-in-head (car lst) (- lv 1)) (count-in-head (cdr lst) lv)))
  7.         (t (count-in-head (cdr lst) lv))))
  8.  
  9. ==> count-in-head
  10.  
  11. (count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 1)
  12.  
  13. ==> 2
  14.  
  15. (count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 2)
  16.  
  17. ==> 2
  18.  
  19. (count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 3)
  20.  
  21. ==> 1
  22.  
  23. (count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 4)
  24.  
  25. ==> 0
  26.  
  27. ;; Одно из решений:
  28.  
  29. (defun del-in-head (lst lv c)
  30.   (cond ((null lst) nil)
  31.         ((zerop c)  lst)
  32.         ((and (listp (car lst)) (= lv 1)) (del-in-head (cdr lst) lv (- c 1)))
  33.         ((listp (car lst))
  34.          (let ((h (count-in-head (car lst) (- lv 1))))
  35.            (if (>= h c) (cons (del-in-head (car lst) (- lv 1) c) (cdr lst))
  36.                         (cons (del-in-head (car lst) (- lv 1) h) (del-in-head (cdr lst) lv (- c h))))))
  37.         (t (cons (car lst) (del-in-head (cdr lst) lv c)))))  
  38.                                    
  39. ==> del-in-head
  40.  
  41. (del-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 1 1)
  42.  
  43. ==> (a f ((2 (g)) 3))
  44.  
  45. (del-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 2 2)
  46.  
  47. ==> (a (b d e) f (3))
  48.  
  49. (del-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 3 1)
  50.  
  51. ==> (a (b (c 1) d e) f ((2) 3))

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

  1. Первый элемент списка — это функция подсчета количества элементов, которые можно удалить из головы списка.
  2. Второй элемент списка — это функция удаления элементов из головы списка.
  3. В первом аргументе функции count-in-head передается список, в котором нужно подсчитать количество элементов для удаления.
  4. Во втором аргументе функции count-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  5. В третьем аргументе функции count-in-head передается список, в котором нужно подсчитать количество элементов для удаления.
  6. В первом аргументе функции del-in-head передается список, из которого нужно удалить элементы.
  7. Во втором аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  8. В третьем аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  9. В четвертом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  10. В первом аргументе функции del-in-head передается список, из которого нужно удалить элементы.
  11. Во втором аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  12. В третьем аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  13. В четвертом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  14. В пятом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  15. В шестом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  16. В седьмом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  17. В восьмом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  18. В девятом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  19. В десятом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.
  20. В одиннадцатом аргументе функции del-in-head передается значение, которое определяет количество элементов, которые нужно удалить.

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


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

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

10   голосов , оценка 4 из 5

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

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

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