2011-01-13 36 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))