这真的是一个广泛的第一次搜索

时间:2014-08-16 12:55:04

标签: tree scheme lisp common-lisp on-lisp

在OnLisp的P.303上有一段广泛优先搜索的伪代码,如下所示。 对于下图,它将首先处理节点1,然后将节点2,3和4放入队列中,然后再次迭代地调用自身。 然后,它将继续处于队列开始处的节点4。这反过来会将节点7和8放入队列的开头,依此类推。

最后,它所经过的路径将是1-> 4-> 7-11-> 12-> 8-> 3-> 2-> 5-> 9-> 10 - > 6是深度优先搜索。 我错了吗?

enter image description here

(define (path node1 node2)
  (bf-path node2 (list (list node1))))

(define (bf-path dest queue)
  (if (null? queue)
      '@
      (let* ((path (car queue))
             (node (car path)))
        (if (eq? node dest)
            (cdr (reverse path))
            (bf-path dest
                    (append (cdr queue)
                    (map (lambda (n)
                           (cons n path))
                         (neighbors node))))))))

1 个答案:

答案 0 :(得分:1)

广度优先搜索利用它将遍历的元素的先进先出队列。

它应该查看第一个节点(1),然后抓住它的子节点(2, 3, 4)并按该顺序填充列表。现在查看列表中的第一个元素并抓住其子项(5, 6),并将它们添加到要查看(3, 4, 5, 6)的事物列表的末尾。

仅在第一个元素上重复此操作。

3 -> (4, 5, 6)
4 -> (5, 6, 7, 8)
5 -> (6, 7, 8, 9, 10)
6 -> (7, 8 , 9, 10)
7 -> (8, 9, 10, 11, 12)
8 -> (9, 10, 11, 12)
9 -> (10, 11, 12)
10 -> (11, 12)
11 -> (12)
12 -> ()

首先进行操作,最后输出(循环播放最近添加的元素),然后创建深度优先搜索。