Деревья и графы - Lisp

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

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

Здравствуйте, помогите пожалуйста с кодом на лиспе. Признаюсь, что не понимаю конкретно что нужно, поэтому прошу помощи. Задание таково: В дереве, организованном с помощью цепных списков, логически удаленные вершины помечены символом "#". Напишите процедуру физического удаления логически удаленных вершин. Сын удаленной вершины переподчиняется ее отцу. Корень дерева удалять запрещено. Заранее спасибо

Решение задачи: «Деревья и графы»

textual
Листинг программы
  1. CL-USER 1 > (defun forsome (L p) (COND ((NULL L) NIL) ((FUNCALL p (CAR L)) T) (T (forsome (CDR L) p))))
  2.  
  3. FORSOME
  4.  
  5. CL-USER 2 > (defun del-node (tree v)
  6.    (cond ((forsome tree #'(lambda (x) (eq (car x) v)))
  7.           (let ((qq (cdar (remove-if-not #'(lambda (x) (eq v (car x))) tree)))
  8.                 (vv (remove-if #'(lambda (x) (eq v (car x))) tree)))
  9.                 (mapcar #'(lambda (x) (if (member v x)
  10.                                           (append (remove v x) qq)
  11.                                           x)) vv)))
  12.          (t (remove-if #'(lambda (y) (null (cdr y)))
  13.                  (mapcar #'(lambda (x) (remove v x)) tree)))))
  14. DEL-NODE
  15.  
  16. CL-USER 3 > (setq *t* '((r a b) (a c d e) (b k l m) (d f g) (k n o) (l p)))
  17.  
  18. ((R A B) (A C D E) (B K L M) (D F G) (K N O) (L P))
  19.  
  20. CL-USER 4 > (del-node *t* 'd)
  21.  
  22. ((R A B) (A C E F G) (B K L M) (K N O) (L P))

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

В первом куске кода определяют функцию forsome. Она принимает два аргумента: список L и предикат p. Если L — это nil, то возвращается nil. Иначе, возвращается T, когда предикат p применяется к первому элементу L. В противном случае, рекурсивно вызывается forsome для оставшейся части списка L и предиката p. Второй кусок кода определяет функцию del-node. Она принимает два аргумента: дерево tree и значение v. Если v присутствует в корневом узле дерева, то рекурсивно вызывается del-node для оставшейся части дерева без корневого узла. В противном случае, рекурсивно вызывается del-node для каждого поддерева, которое не содержит v в корневом узле. В третьем куске кода устанавливается переменная *t* в список ((r a b) (a c d e) (b k l m) (d f g) (k n o) (l p)). В четвёртом куске кода вызывается функция del-node с аргументами *t* и d. В результате выполнения функции, d удаляется из списка *t*, и возвращается новый список без d.

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


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

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

9   голосов , оценка 3.778 из 5

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

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

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