【问题标题】:Determine level of searched element确定搜索元素的级别
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 2013-06-26
    • 1970-01-01
    • 2016-12-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多