Алгоритм Дейкстры на схеме - PullRequest
1 голос
/ 04 января 2012

Я создал почти все процедуры, необходимые для работы моего алгоритма Дейкстры, но у меня возникли некоторые проблемы с процедурой кратчайшего пути, я написал ее на бумаге, но не могу заставить ее работать по схеме

(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))))

Выше приведена основная процедура, которая выдает мне ошибку в 4-й строке

(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)

Я получаю ошибку: "expand: несвязанный идентификатор в модуле в: i" в 4-й строке

(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))

Все процедуры определены так, как должны, но основная не работает должным образом.Сначала это было написано на бумаге, я все перепробовал и что-то упустил

Ответы [ 2 ]

1 голос
/ 04 января 2012

Мне кажется, что вы структурировали свою программу как ряд небольших функций, определенных внутри более крупной.Это плохая идея.Преимущество (внутренние процедуры могут относиться к источнику, месту назначения и графу) перевешивается невозможностью независимого тестирования вспомогательных функций.Если бы я отлаживал эту функцию, я бы:

  • поднял внутренние функции до верхнего уровня,
  • создал операторы цели для каждой и
  • записалнесколько тестовых случаев для каждого.
0 голосов
/ 04 января 2012

Единственная переменная, связанная во внутреннем обновлении функции, это x. Единственными переменными, связанными во внешней функции shorttestpath, являются источник, судьба и граф. Вы получаете сообщение об ошибке, потому что я не связан. Ни n, ни v. Вам нужно либо передать i, n и v во внешние функции, либо определить их как глобальные переменные, либо связать их с помощью let внутри функции.

...