2014-03-29 5 views
1

주어진 노드에서 가능한 모든 경로가 포함 된 그래프의 너비 우선 트리 구조와 비슷한 것을 작성하려고했습니다. 팝업과 같은 일종의 오류만큼 알고리즘에 문제가 없었습니다. 여기에 아래의 관련 코드입니다 :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) 목록이 # 기호가있는 중간 재귀가 바뀌 었는지 이해할 수 없습니다.

답변

4

보통 나는 그것이 *print-level*과 관련이 있다고 생각합니다.

이 변수는 중첩 목록을 인쇄하는 정도를 제어합니다. 레벨 번호로 설정하십시오. 더 깊은 레벨의 목록은 # 문자로 바뀝니다.

NIL으로 설정하면 도움이되지 않는 경우 Allegro CL 매뉴얼을 참조하십시오. IDE에 자체 설정이 있음을 원격으로 기억할 수도 있습니다.

관련 문제