2011-01-13 14 views
1

이것은 Exercise 28.1.2 from HtDP입니다. 성공적으로 neighbors 함수를 구현했으며 모든 테스트 케이스가 성공합니다. 무한 루프 백 트랙

(define Graph (list 
       (list 'A (list 'B 'E)) 
       (list 'B (list 'E 'F)) 
       (list 'C (list 'D)) 
       (list 'D empty) 
       (list 'E (list 'C 'F)) 
       (list 'F (list 'D 'G)) 
       (list 'G empty))) 

(define (first-line n alist) 
    (cond 
    [(symbol=? (first alist) n) alist] 
    [else empty])) 

;; returns empty if node is not in graph 
(define (neighbors n g) 
    (cond 
    [(empty? g) empty] 
    [(cons? (first g)) 
    (cond 
     [(symbol=? (first (first g)) n) (first-line n (first g))] 
     [else (neighbors n (rest g))])])) 

; test cases 
(equal? (neighbors 'A Graph) (list 'A (list 'B 'E))) 
(equal? (neighbors 'B Graph) (list 'B (list 'E 'F))) 
(equal? (neighbors 'C Graph) (list 'C (list 'D))) 
(equal? (neighbors 'D Graph) (list 'D empty)) 
(equal? (neighbors 'E Graph) (list 'E (list 'C 'F))) 
(equal? (neighbors 'F Graph) (list 'F (list 'D 'G))) 
(equal? (neighbors 'G Graph) (list 'G empty)) 
(equal? (neighbors 'H Graph) empty) 

문제

내가 때 텍스트의 Figure 77에서 코드를 복사 - 붙여 온다. 목적지 노드가 원 노드로부터 도달 가능한지 여부를 결정합니다. 그러나 코드는 원래 노드와 대상 노드가 같은 가장 사소한 경우를 제외하고는 무한 루프로 진행됩니다.

;; find-route : node node graph -> (listof node) or false 
;; to create a path from origination to destination in G 
;; if there is no path, the function produces false 
(define (find-route origination destination G) 
    (cond 
    [(symbol=? origination destination) (list destination)] 
    [else (local ((define possible-route 
      (find-route/list (neighbors origination G) destination G))) 
     (cond 
      [(boolean? possible-route) false] 
      [else (cons origination possible-route)]))])) 

;; find-route/list : (listof node) node graph -> (listof node) or false 
;; to create a path from some node on lo-Os to D 
;; if there is no path, the function produces false 
(define (find-route/list lo-Os D G) 
    (cond 
    [(empty? lo-Os) false] 
    [else (local ((define possible-route (find-route (first lo-Os) D G))) 
     (cond 
      [(boolean? possible-route) (find-route/list (rest lo-Os) D G)] 
      [else possible-route]))])) 

내 코드에 문제가 있습니까? 고맙습니다.

답변

1

확인 문제는 실제로 내 자신의 코드에 있습니다. 나는 노드와 그것의 이웃 노드들을 포함하는리스트가 아닌리스트를 반환하기로되어 있었다. 즉 (neighbor 'A Graph)(list 'B 'E)이 아니고 (list 'A (list 'B 'E))이 아닙니다.