【发布时间】:2018-11-26 02:19:17
【问题描述】:
我正在尝试编写一个可以在树中查找项目的函数,类似于序列的内置 find 函数。电话可能看起来像(find-in-tree item tree :test test-fn :key key-fn)。 hyperspec 说传递给find 的项目可以是任何 lisp 对象(即“任何 Lisp 数据”),但我想到的树不是通常的 Lisp 二叉树。这棵树,称为多树,将是原子或列表的(可能是递归或点状的)列表。一个例子是(find-in-tree '(1 2) '(1 (2) nil (3 (1 2)) . 4) :test #'equal) => (1 2) 或一些非零值。
环顾四周,我在http://lisptips.com/post/43404489000/the-tree-walkers-of-cl 发现了一些有趣的代码,经过适当的修改,似乎确实适用于标准的 cons 树:
(defun find-in-tree (item tree &key (test #'eql))
(catch 'find-in-tree
(subst-if t (constantly nil) tree
:key (lambda (element)
(when (funcall test element item)
(throw 'find-in-tree element))))
nil))
但是,我不确定如何为多树调整(或构建递归函数)。
【问题讨论】:
-
不应该用
(or (find-in-tree ... (car tree) ...) (find-in-tree ... (cdr tree) ...))吗,(搜索nil的时候有一些注意事项?) -
是的,它为原子修复了它,谢谢。
-
你需要想出树的定义和一些实际的例子。否则我们必须猜测。也不清楚为什么你不想检查 CDR。只看 CAR 不会遍历树。
标签: tree common-lisp