如何在计划中重写我的代码,而无需在结构中保存状态信息



我在方案中播放,我试图创建一个谓词,该谓词会告诉我,如果给定图中的两个顶点之间有一个路径。我的程序基础使用队列来弄清楚它。我使用BFS穿越图形,然后将所有相邻的顶点添加到队列中,如果我所寻求的值在上述队列中,我将返回#t。但是该解决方案需要使用数据结构来存储所有信息,我知道,通过多个功能之间的队列并不理想。如何在不使用队列的情况下更改代码并使其更加干净?您可以在下面看到我的代码。

我使用了以下诉讼:http://www.geeksforgeeks.org/find-if-if-there-is-a-path-bet-two-vertices-in-vertices-in-a-a-a-given-gin-gind-given-given-given-given-given

(require data/queue)
(define-struct graph (vertices edges))
(define-struct vertice (name visited))
(define-struct edge (start-vertice end-vertice length))
;I create data for testing here
(define vertices-list2
  (list (make-vertice 0 0)
        (make-vertice 1 0)
        (make-vertice 2 0)
        )
  )
(define edges-list2
  (list (make-edge 0 1 0)
        (make-edge 1 2 0)
        )
  )
;Const for marking a vertice as visited
(define VISITED 99999)
(define (reachable? X Y G)
  (let ((q (make-queue)))
    (cond
      [(empty? (graph-edges G)) #f]
      [(= X Y) #t]
      [else (bfs-graph X Y G q) ]
      )
    )
  )
(define (bfs-graph X Y G q)
  (cond
    [(not(eq? (vertice-visited (find-vertice X (graph-vertices G))) VISITED))
     (begin
       (set-vertice-visited! (find-vertice X (graph-vertices G)) VISITED)
       (find-adj X (graph-edges G) q)
       (cond
         [(queue-empty? q) #f]
         [(memq Y (queue->list q)) #t]
         [else (bfs-graph (dequeue! q) Y G q)]
         )
       )
     ]
    [(queue-empty? q) #f]
    [else (bfs-graph (dequeue! q) Y G q)]
    )
  )
(define (find-vertice V vertice-list)
  (cond
    [(empty? vertice-list) (error 'find-vertice "Graph does not contain given vertice")]
    [(eq? V (vertice-name (car vertice-list))) (car vertice-list)]
    [else (find-vertice V (cdr vertice-list))]
    )
  )
(define (find-adj V edge-list q)
  (cond
    [(empty? edge-list) q]
    [(eq? V (edge-start-vertice (car edge-list)))
     (begin
       (enqueue! q (edge-end-vertice (car edge-list)))
       (find-adj V (cdr edge-list) q))
     ]
    [else (find-adj V (cdr edge-list) q)]
    )
  )
;Run
(define G (make-graph vertices-list2 edges-list2))
;Predicate call
(reachable? 0 1 G)

我不确定为什么您不想通过队列。

然而,避免队列的一种方法是使队列和助手在bfs-graph上同时发挥作用。

(define (bfs-graph X Y G)
  (define q (make-queue))
  (define (find-vertice V vertice-list) ...)
  (define (find-adj V edge-list) ...)
  (cond
    [(not(eq? (vertice-visited (find-vertice X (graph-vertices G))) VISITED))
     ...]
   ... as-before ...))

ps:一个顶点,两个顶点

最新更新