我已经创建了Dijkstra算法运行所需的几乎每一个过程,但是我对shortestpath过程有一些问题,我写在纸上,但无法使它在scheme上运行
(define (shortestpath origin destiny graph)
(define (update x)
(begin
(set! new-dist (+ (dist-between n x graph)
(dist-info-node (get-info-node i n))))
(when (< new-dist (dist-info-node (get-info-node i v)))
(update-previous-dist-node i v new-dist n))))
上面是我在第四行犯错误的主要步骤
(define (get-info-node i n)
(define (get-info-node-aux i n cont)
(if (equal? n (vector-ref (no-info-no i) cont))
(vector-ref i cont)
(get-info-node-aux i n (+ cont 1))))
(get-info-node-aux i n 0))
(define (dist-info-node i)
(vector-ref i 1))
(define new-dist 0)
我得到的错误是第4行的“expand:unbound identifier in module in:i”
(define (update-previous-dist-node! i n d a)
(define (update-previous-dist-node!-aux i n d a cont)
(if (equal? n (vector-ref (no-info-no i) cont))
(begin
(modify-dist! (vector-ref i cont) d)
(modify-previous! (vector-ref i cont) a))
(update-previous-dist-node!-aux i n d a (+ cont 1))))
(update-previous-dist-node!-aux i n d a 0))
所有程序的定义都是应该的,但主要程序的工作不正常。这是先写在纸上的,我什么都试过了,一定是漏掉了什么
最佳答案
在我看来,你的程序是由一个较大的函数中定义的一些小函数构成的。这是个坏主意。无法独立测试助手函数,这一优势(内部过程可以引用源、目标和图)被抵消了。如果我调试这个函数,我会:
把内部功能拉到最高层,
为每一项创建目的语句,并且
为每一个写几个测试用例。