주어진 노드에서 가능한 모든 경로가 포함 된 그래프의 너비 우선 트리 구조와 비슷한 것을 작성하려고했습니다. 팝업과 같은 일종의 오류만큼 알고리즘에 문제가 없었습니다. 여기에 아래의 관련 코드입니다 :lisp 해시 기호가 반환 된 값을 바꿉니다.
(set 'my-graph '((A (B C))
(B (D E))
(C (F G))
(D (E))
(E (H))
(F (H I))
(G (I))
(H (J))
(I (J))
(J())))
(defun search-tree(graph traversed visited)
(cond
((null traversed) NIL)
(:else (let*
((new-visited (append visited (list (car traversed))))
(children (add-children graph (car traversed)
(append (cdr traversed) new-visited))))
(cond
((null children) (list (car traversed)))
(:else
(cons (car traversed)
(mapcar (lambda(x) (search-tree graph (list x) new-visited)) children)))
)
)
)
)
)
;;; Selects the node to pick returned children from
(defun add-children(graph node visited)
(cond
((null graph) NIL)
((equal (caar graph) node) (new-nodes (cadar graph) visited))
(:else (add-children (cdr graph) node visited))
)
)
;;; Returns new, unvisited nodes from the children of a node
(defun new-nodes(children visited)
(cond
((null children) NIL)
((member (car children) visited) (new-nodes (cdr children) visited))
(:else (cons (car children) (new-nodes (cdr children) visited)))
)
)
기능 검색 트리가 (검색 트리 내 그래프 '(A)'())로 불린다는 내가 제대로 원하는 거의 모든 것을 반환하지만 제 1 단말 노드한다 # 기호로 바뀝니다 ((J) 여야합니다). 여기에 무슨 문제가있을 수 있니?
반환 값입니다.
(A (B (D (E (H #))) (E (H (J)))) (C (F (H (J)) (I (J))) (G (I (J)))))
코드 추적을 시도했지만 왜 (J) 목록이 # 기호가있는 중간 재귀가 바뀌 었는지 이해할 수 없습니다.