Lisp 树插入

Lisp tree insertion

我编写了一个 lisp 代码,可以将数字列表转换为树。树的规则是左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值。

这是我的 lisp 代码:

(defun trees (list node)
  (if (null list)
      (list node)
      (progn
        (setf valueNode (car node))
        (setf valueList (car list))
        (if (< valueNode valueList)
            (setf list (append (list (car list))
                               (cons (trees (car (cdr list)) node)
                                     (car (cdr (cdr list)))))))
        (if (> valueNode valueList)
            (setf list (append (list (car list))
                               (cons (car (cdr list))
                                     (trees (car (cdr (cdr list))) node))))))))

通常, 这个命令

(write (trees '(8 (7 () ()) (12 () ())) '(10 () ())))

应该return

(8 (7 () ()) (12 (10 () ()) ()))

但实际上 returns (8 (7 () ())).

此外,如果您需要更多说明,请告诉我,我会澄清的。 (请帮助我,我迷路了)

您正在修改 list 但不会返回 它。

这是您需要做的:

(defun trees (list node)
  (if (null list)
      (list node)
      (let ((valueNode (car node)) (valueList (car list)))
        (if (< valueNode valueList)
            (setf list (append (list (car list))
                               (cons (trees (car (cdr list)) node)
                                     (car (cdr (cdr list)))))))
        (if (> valueNode valueList)
            (setf list (append (list (car list))
                               (cons (car (cdr list))
                                     (trees (car (cdr (cdr list))) node)))))
        list)))

现在:

(trees '(8 (7 () ()) (12 () ())) '(10 () ()))
==> (8 (7 NIL NIL) 12 ((10 NIL NIL)))

PS。请注意 let 的使用和正确的缩进。