【问题标题】:Replacing an element from a tree with another Common LISP用另一个 Common LISP 替换树中的元素
【发布时间】:2016-04-02 19:30:24
【问题描述】:

我正在尝试用另一个元素替换树中的一个元素。到目前为止,我设法替换了原子,但它不会正确添加到列表中

代码:

(defun replacing (tree trl wrl)
  (cond
    ((null tree) nil)
    ((atom tree)
     (cond ((eql tree trl) (list wrl))
           (t (list tree))))
    (t (apply 'nconc (mapcar #'(lambda (x) (replacing x trl wrl))
                             tree)))))

示例:(replacing '(A (B) (C (D) (E))) 'D 'W) -> (A (B) (C (W) (E)))

我得到了什么:(A B C W E)

有什么想法可以改变吗?

【问题讨论】:

    标签: tree common-lisp substitution


    【解决方案1】:

    在原子的情况下,只需返回原子或其替换。你返回一个列表。

    在树的情况下,使用 mapcar 将函数映射到子树上。摆脱NCONC

    Common Lisp 已经以 subst 的名义拥有此功能:

    CL-USER 1 > (subst 'W 'D '(A (D) (C (D) (D))))
    (A (W) (C (W) (W)))
    

    代码:

    (defun replacing (tree trl wrl)
      (cond
       ((null tree) nil)
       ((atom tree)
        (if (eql tree trl) wrl tree))
       (t (mapcar #'(lambda (x)
                      (replacing x trl wrl))
                  tree))))
    

    【讨论】:

    • 我想自己做。我想我已经按照你说的做了。查看我的代码和我的最后一个问题。
    • @Melye77:看看我的建议和你的代码。我已经告诉过你要改变什么了。
    • 但是nconc会抛出一个错误。 Nconc 仅适用于列表
    • @Melye77:摆脱 nconc。
    • 哦,好吧,你是对的。摆脱 (list ...) 并仅使用 mapcar。谢谢,辛苦了!
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2012-08-06
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2019-05-10
    相关资源
    最近更新 更多