【发布时间】:2010-11-22 23:14:26
【问题描述】:
给定一个列表/树的形式: (node1 (node2) (node3 (node4) (node5)) (node6)) 我应该能够找出搜索到的节点所在的深度。
这是我到目前为止所做的:
(defun search-it (lst level n)
(cond ((null lst) nil)
((and (atom (car lst)) (equal (car lst) n)) level)
((atom (car lst)) (search-it (cdr lst) level n))
(t (cons (search-it (car lst) (+ 1 level) n)
(search-it (cdr lst) level n)))))
(defun search-node (l n)
(search-it l 0 n))
对于这个特定的实现,我有一个正确的解决方案,但困扰我的是我无法摆脱一些 nil 列表。例如:
(search-node '(1 (2) (3 (4) (6) (7) (8 (9) (10)))) 6)
(NIL (NIL 2 NIL (NIL NIL)))
如果我们考虑深度为 0 的根节点,则该解决方案是正确的。 现在我当然可以在 search-node 函数中添加一些代码来删除除解决方案之外的所有内容,但我不禁觉得这不是最优雅的方法。
LE:预期结果应该是深度或深度列表,以防数字出现多次。
有人指点吗? PS:lisp新手
【问题讨论】:
-
你想要什么样的结果?深度列表?单一深度?如果在多个地方发现该物品怎么办?
-
在 Lisp 中,你可以写 'list' 而不是 'lst'。
-
如果项目出现不止一次的深度列表。 @Rainer Joswig:我知道,但 lst 或 l 对我来说不太容易混淆
-
但是 'lst' 让所有其他 Lisp 程序员感到困惑。只有 Scheme 程序员不会感到困惑。
标签: lisp common-lisp