以下来自http://htdp.org/2003-09-26/Book/curriculum-ZH-38.html#node_chap_30的代码似乎不起作用(我添加了 println 语句进行调试)
(define (neighbor a-node sg)
(println "in neighbor fn")
(cond
[(empty? sg) (error "neighbor: impossible")]
[else (cond
[(symbol=? (first (first sg)) a-node)
(second (first sg))]
[else (neighbor a-node (rest sg))])]))
(define (route-exists? orig dest sg)
(println "in route-exits? fn")
(cond
[(symbol=? orig dest) true]
[else (route-exists? (neighbor orig sg) dest sg)]))
我还尝试了第二个版本(我添加了包含 fn):
(define (contains item sl)
(ormap (lambda (x) (equal? item x)) sl) )
(define (route-exists2? orig dest sg)
(local ((define (re-accu? orig dest sg accu-seen)
(cond
[(symbol=? orig dest) true]
[(contains orig accu-seen) false]
[else (re-accu? (neighbor orig sg) dest sg (cons orig accu-seen))])))
(re-accu? orig dest sg empty)))
该页面本身的以下示例会创建无限循环:
(route-exists? 'C 'D '((A B) (B C) (C E) (D E) (E B) (F F)))
以下产生#f 即使解决方案显然是可能的:
(route-exists2? 'C 'D '((A B) (B C) (C E) (D E) (E B) (F F)))
以下测试(列表是我的)在这里也会产生错误,即使解决方案显然是可能的:
(route-exists?
'A 'C
'('('A 'B) '('B 'C) '('A 'C) '('A 'D) '('B 'E) '('E 'F) '('B 'F) '('F 'G) )
)
(route-exists2?
'A 'C
'('('A 'B) '('B 'C) '('A 'C) '('A 'D) '('B 'E) '('E 'F) '('B 'F) '('F 'G) )
)
问题出在哪里,如何解决?
编辑:
即使选择了新函数并删除了多余的引号,以下操作也不起作用(即使 A 和 D 之间有直接路径):
(route-exists2?
'A 'D
'((A B) (B C) (A C) (A D) (B E) (E F) (B F) (F G) ) )
它输出一个错误:
neighbor: impossible