将每个子列表的第一个元素乘以-1 ?? Common Lisp

时间:2014-12-10 12:01:11

标签: list lisp common-lisp

作为更大项目的一部分,我希望能够将每个子列表的每个第一个元素复用为-1。我正试图像这样使用递归来做这件事:

(defun negative (secondpoly)
    (let ((t1(car secondpoly))
         (rem(cdr secondpoly)))
        (let ((c1(car t1)))
            (if (not (null (cdr secondpoly)))
                (negative (append (* c1 -1) rem))
            )
        )
    )
)

使用此输入:

(pminus '((5 x 2)(100 x 2)))

我想收到这个输出:

(pminus '((-5 x 2)(-100 x 2)))

我想知道是否有人可以告诉我这样做的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您的输入确实如下:'(pminus ((5 x 2)(100 x 2)))

(defun negative-first (poly)
  (cons (car poly)
        (mapcar (lambda (el)
                  (cons (- (car el)) (cdr el)))
                (cadr poly))))

CL-USER> (negative-first '(pminus ((5 x 2)(100 x 2))))
(PMINUS (-5 X 2) (-100 X 2))

但对我来说,看起来似乎有一个错误的解释,你的输入是'((5 x 2)(100 x 2)),如果是这样,你的功能是:

(defun negative-first (poly)
  (mapcar (lambda (el)
            (cons (- (car el)) (cdr el)))
          poly))


CL-USER> (negative-first '((5 x 2)(100 x 2)))
((-5 X 2) (-100 X 2))

如果你需要使用更多嵌套和复杂的数据,你可能应该为谁做一些例子,这个函数只适用于一个级别((5 x 2) (100 x 2) (40 x 3) .... )