首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scheme中重写代码,而不在结构中保存状态信息?

如何在Scheme中重写代码,而不在结构中保存状态信息?
EN

Stack Overflow用户
提问于 2016-06-17 23:27:10
回答 1查看 69关注 0票数 1

我在玩Scheme,我试图创建一个谓词,它将告诉我,在给定的图中,两个顶点之间是否存在路径。我的程序基本上使用队列来解决这个问题。我使用BFS遍历图形,并将所有相邻顶点添加到队列中,如果我的搜索值在队列中,则返回#t。但这种解决方案需要使用数据结构来存储所有信息,并且我知道,在多个函数之间传递队列并不理想。如何在不使用队列的情况下更改代码并使其更整洁?你可以在下面看到我的代码。

我使用了这个方法:http://www.geeksforgeeks.org/find-if-there-is-a-path-between-two-vertices-in-a-given-graph/

代码语言:javascript
复制
(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)
EN

回答 1

Stack Overflow用户

发布于 2016-06-18 02:45:40

我不知道您为什么不想传递队列。

然而,避免传递队列的一种方法是使队列和助手函数都位于bfs-graph的本地。

代码语言:javascript
复制
(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:一个顶点,两个顶点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37885249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档