У меня есть список вида:Удаление элементов внутри подсписков
((1 (3 2 4)) (2 (3 1)) (3 (2 1)) (4 (1)))
Этот список представляет собой график формы («узел» («ребер»)). Как я могу подойти к написанию процедуры, которая принимает значение, представляющее узел, например «1», и удаляет этот узел из графика. Например: (delete-node ng) с вводом 5 и '((1 (3 2)) (2 (3 1)) (3 (2 1)) (4 (5)) (5 (4))) следует выход:
((1 (3 2)) (2 (3 1)) (3 (2 1)) (4()))
Как можно видеть из приведенного выше примера, узел и любые ребра добавлены к этому узлу оба должны быть удалены. Мой код до сих пор выглядит следующим образом:
(define graph '((1 (3 2)) (2 (3 1)) (3 (2 1)) (4 (5)) (5 (4))))
;...Other procedures not shown...
(define (delete-node n g)
(define (delete ls item)
(cond ((null? ls) nil)
((pair? (car ls))
(cons (delete (car ls) item) (delete (cdr ls) item)))
((equal? (car ls) item) (delete (cdr ls) item))
(else (cons (car ls) (delete (cdr ls) item)))))
(delete (filter (lambda (x) (not (eq? (car x) n))) g) n))
(delete-node 5 graph)
Приведенный выше код работает, но есть ли более эффективный способ сделать это?
Опять же, что вы пробовали? Не могли бы вы опубликовать то, что у вас есть, чтобы мы могли видеть, где вы застреваете? –
Обновлено, чтобы прояснить проблему и добавить дополнительную информацию. – martinsarif