给定格式的列表/树:( 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新手
答案 0 :(得分:2)
通常返回深度列表。因此,如果找到一个项目,则返回单个深度的列表。如果你分支到列表的第一个和其余部分,那么不要'cons',而是'append'。
另请注意,您的代码找不到所有深度。
CL-USER 6 > (search-node '(6 (6)) 6)
0