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的根节点,则解决方案是正确的.
当然,我可以在搜索节点功能中添加一些代码来删除除解决方案之外的所有内容,我不禁觉得这不是最优雅的方式.

LE:如果数字出现不止一次,预期结果应该是深度或深度列表.

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

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

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

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