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

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

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

Написать программу выделения списков на заданном уровне и удаления заданного их количества в произвольном введенном исходном списке. Исходный список имеет уровень 0, вложенный в него список имеет уровень 1 и т.д. Пример. Пусть имя программы p1, допустим, набрали исходный список:
( a (b (c 1)d e) f (  (2 (g )  ) 3)  ).
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
Листинг программы
;; Вспомогательная функция подсчета сколько можно удалить из головы списка
 
(defun count-in-head (lst lv)
  (cond ((null lst) 0)
        ((and (listp (car lst)) (= lv 1)) (+ 1 (count-in-head (cdr lst) lv)))
        ((listp (car lst)) (+ (count-in-head (car lst) (- lv 1)) (count-in-head (cdr lst) lv)))
        (t (count-in-head (cdr lst) lv))))
 
==> count-in-head
 
(count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 1) 
 
==> 2
 
(count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 2) 
 
==> 2
 
(count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 3) 
 
==> 1
 
(count-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 4) 
 
==> 0
 
;; Одно из решений:
 
(defun del-in-head (lst lv c)
  (cond ((null lst) nil)
        ((zerop c)  lst)
        ((and (listp (car lst)) (= lv 1)) (del-in-head (cdr lst) lv (- c 1)))
        ((listp (car lst)) 
         (let ((h (count-in-head (car lst) (- lv 1))))
           (if (>= h c) (cons (del-in-head (car lst) (- lv 1) c) (cdr lst))
                        (cons (del-in-head (car lst) (- lv 1) h) (del-in-head (cdr lst) lv (- c h))))))
        (t (cons (car lst) (del-in-head (cdr lst) lv c)))))   
                                   
==> del-in-head
 
(del-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 1 1) 
 
==> (a f ((2 (g)) 3))
 
(del-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 2 2) 
 
==> (a (b d e) f (3))
 
(del-in-head '(a (b (c 1) d e) f ((2 (g)) 3)) 3 1) 
 
==> (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
Похожие ответы