确定搜索元素的级别

时间:2010-11-22 23:14:27

标签: lisp common-lisp

给定格式的列表/树:( 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))

对于这个特定的实现,我有一个正确的解决方案,但困扰我的是我无法摆脱一些零列表。例如:

 (search-node '(1 (2) (3 (4) (6) (7) (8 (9) (10)))) 6)
 (NIL (NIL 2 NIL (NIL NIL)))

如果我们考虑深度为0的根节点,那么解决方案是正确的。 当然,我可以在 search-node 函数中添加一些代码来删除除解决方案之外的所有内容,我不禁觉得这不是最优雅的方法。

LE :如果数字出现多次,预期结果应为深度或深度列表。

有人指点什么? PS:lisp新手

1 个答案:

答案 0 :(得分:2)

通常返回深度列表。因此,如果找到一个项目,则返回单个深度的列表。如果你分支到列表的第一个和其余部分,那么不要'cons',而是'append'。

另请注意,您的代码找不到所有深度。

CL-USER 6 > (search-node '(6 (6)) 6)
0