Я разрабатываю дерево k-d в Lisp. Я пишу функцию, которая позволяет мне искать узел в дереве k-d. Эта функция определяется следующим образом:Поиск элемента в дереве k-d
(defmethod find-node ((kdt kdtree) target &key (key #'value) (test #'equal))
(unless (null (root kdt))
(find-node (root kdt) target :key key :test test)))
(defmethod find-node ((node kdnode) target &key (key #'value) (test #'equal))
(format t "Testing node ~a~%" (value node))
(format t "Result is ~a~%" (funcall test (funcall key node) target))
(if (funcall test (funcall key node) target)
node
(progn
(unless (null (left node))
(find-node (left node) target :key key :test test))
(unless (null (right node))
(find-node (right node) target :key key :test test)))))
Я построить дерево со следующими данными: '((2 3) (5 4) (9 6) (4 7) (8 1) (7 2))
. Итак, теперь я использую эту функцию, чтобы найти узел '(2 3)
.
(find-node kdt '(2 3))
С format
заявления, я получаю этот выход:
Testing node (7 2)
Result is NIL
Testing node (5 4)
Result is NIL
Testing node (2 3)
Result is T
Testing node (4 7)
Result is NIL
Testing node (9 6)
Result is NIL
Testing node (8 1)
Result is NIL
NIL
Итак, как вы можете видеть, узел найден, так как результат теста T
, однако, поиск продолжается и результатом является NIL
. Почему эта функция не возвращает узел?
Я предпочитаю первое решение :). – JNevens