我已经创建了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))

所有程序的定义都是应该的,但主要程序的工作不正常。这是先写在纸上的,我什么都试过了,一定是漏掉了什么

最佳答案

在我看来,你的程序是由一个较大的函数中定义的一些小函数构成的。这是个坏主意。无法独立测试助手函数,这一优势(内部过程可以引用源、目标和图)被抵消了。如果我调试这个函数,我会:
把内部功能拉到最高层,
为每一项创建目的语句,并且
为每一个写几个测试用例。

10-07 19:42
查看更多