在算法中&数据II,我们用这些来“退出”或从(长)函数
例如“回归”的BFS algorthm穿越树木是这样实现的所有时间:
(define (BFS graph root-discovered node-discovered edge-discovered edge-bumped . nodes)
(define visited (make-vector (graph.order graph) #f))
(define q (queue.new))
(define exit())
(define (BFS-tree node)
(if (node-discovered node)
(exit node))
(graph.map-edges
graph
node
(lambda (node2)
(cond ((not (vector-ref visited node2))
(when (edge-discovered node node2)
(vector-set! visited node2 #t)
(queue.enqueue! q node2)))
(else
(edge-bumped node node2)))))
(if (not (queue.empty? q))
(BFS-tree (queue.serve! q))))
(call-with-current-continuation
(lambda (my-future)
(set! exit my-future)
(cond ((null? nodes)
(graph.map-nodes
graph
(lambda (node)
(when (not (vector-ref visited node))
(vector-set! visited node #t)
(root-discovered node)
(BFS-tree node)))))
(else
(let loop-nodes
((node-list (car nodes)))
(vector-set! visited (car node-list) #t)
(root-discovered (car node-list))
(BFS-tree (car node-list))
(if (not (null? (cdr node-list)))
(loop-nodes (cdr node-list)))))))))
正如你所看到的算法,当节点发现的函数返回true,将退出:
(if (node-discovered node)
(exit node))
功能也将给予“回报值“:‘节点’
为什么函数退出,是因为这句话的:
(call-with-current-continuation
(lambda (my-future)
(set! exit my-future)
当我们使用退出,它会回到状态执行之前,清空调用堆栈和返回你给它的价值。
所以基本上,拨打-CC使用(在这里)跳出一个递归函数,而不是等待整个递归本身结束
(做大量的计算工作时,它可以是相当昂贵)
另一个较小的例子做与呼叫-CC相同的:
(define (connected? g node1 node2)
(define visited (make-vector (graph.order g) #f))
(define return())
(define (connected-rec x y)
(if (eq? x y)
(return #t))
(vector-set! visited x #t)
(graph.map-edges g
x
(lambda (t)
(if (not (vector-ref visited t))
(connected-rec t y)))))
(call-with-current-continuation
(lambda (future)
(set! return future)
(connected-rec node1 node2)
(return #f))))
是的!我正在寻找代码示例。 – 2008-09-19 20:51:54