在 lisp 中乘以 2 个向量
multiplicating 2 vectors in lisp
我正在尝试用 lisp 将两个向量相乘。
我的代码是:
(defun produs(x y)
(cond
((or (null x) (null y))
nil)
((eq (cdr x) nil)
(cons (* (car x) (car y))
(cdr y)))
((eq (cdr y) nil)
(cons (* (car x) (car y))
(cdr x)))
(t
(cons (* (car x) (car y))
(produs (cdr x) (cdr y))))))
当我验证
(produs '(7) '(1 2))
它给了我 (7 2)。
第 4 行代码没有指定如果 x 主体的其余部分为 nil,则将其与 y 的所有元素相乘?
如果我正确理解了您想要实现的目标,则此代码应该有效:
(defun produs(x y)
(cond
((or (null x) (null y)) nil)
((eq (cdr x) nil) ( cons (* (car x)(car y))(produs (cdr y) x )))
((eq (cdr y) nil) ( cons (* (car x)(car y)) (produs (cdr x) y)))
(t (cons (*(car x)(car y)) (produs (cdr x)(cdr y))))
)
)
问题是您没有"saying"将所有元素与头部 x 相乘,而只是将 y 中的所有剩余元素添加到结果列表中。
(produs '(7) '(1 2)) => (7 14)
您也可以尝试稍微重构代码以避免重复自己:
(defun produs (x y)
(when (and x y)
(cons (* (first x) (first y))
(let ((rx (rest x))
(ry (rest y)))
(cond
((and rx ry) (produs rx ry))
(rx (produs rx y))
(ry (produs ry x)))))))
我正在尝试用 lisp 将两个向量相乘。 我的代码是:
(defun produs(x y)
(cond
((or (null x) (null y))
nil)
((eq (cdr x) nil)
(cons (* (car x) (car y))
(cdr y)))
((eq (cdr y) nil)
(cons (* (car x) (car y))
(cdr x)))
(t
(cons (* (car x) (car y))
(produs (cdr x) (cdr y))))))
当我验证
(produs '(7) '(1 2))
它给了我 (7 2)。
第 4 行代码没有指定如果 x 主体的其余部分为 nil,则将其与 y 的所有元素相乘?
如果我正确理解了您想要实现的目标,则此代码应该有效:
(defun produs(x y)
(cond
((or (null x) (null y)) nil)
((eq (cdr x) nil) ( cons (* (car x)(car y))(produs (cdr y) x )))
((eq (cdr y) nil) ( cons (* (car x)(car y)) (produs (cdr x) y)))
(t (cons (*(car x)(car y)) (produs (cdr x)(cdr y))))
)
)
问题是您没有"saying"将所有元素与头部 x 相乘,而只是将 y 中的所有剩余元素添加到结果列表中。
(produs '(7) '(1 2)) => (7 14)
您也可以尝试稍微重构代码以避免重复自己:
(defun produs (x y)
(when (and x y)
(cons (* (first x) (first y))
(let ((rx (rest x))
(ry (rest y)))
(cond
((and rx ry) (produs rx ry))
(rx (produs rx y))
(ry (produs ry x)))))))