繁体   English   中英

方案的Dijkstra算法

[英]Dijkstra algorithm on scheme

我已经创建了Dijkstra算法正常工作所需的几乎所有过程,但我在最短路径过程中遇到了一些问题,我在纸上写了它,但无法使其在方案中起作用

(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行上的“展开:模块中的未绑定标识符: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))

所有程序均已定义,但主要程序无法正常工作。 这是先写在纸上的,我已经尝试了一切,但我一定想念一些东西

在我看来,您好像已将程序构造为在一个较大的内部定义的许多小功能一样。 这是一个坏主意。 无法独立测试帮助程序功能的优势(内部过程可以引用起点,目的地和图形)超过了优势。 如果要调试此功能,我将:

  • 将内部功能提升到最高水平,
  • 为每个目标创建目的陈述,以及
  • 为每个测试用例编写一些测试用例。

内部函数更新中唯一绑定的变量是x。 外部函数最短路径中绑定的唯一变量是原点,目的地和图形。 您收到错误消息,因为我不受约束。 n或v都不是。您需要将i,n和v传递给外部函数,或者将它们定义为全局变量,或者在函数内部使用let绑定它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM