Recursion 编写一个递归LISP函数,用于查找两个长度相同的数字列表的点积

Recursion 编写一个递归LISP函数,用于查找两个长度相同的数字列表的点积,recursion,lisp,common-lisp,Recursion,Lisp,Common Lisp,我刚开始学习LISP,我正试图找出如何编写下面的递归函数 我也该这么做吗 (DOT-PRODUCT '(1 2) '(3 4))) 输出应该是11 我写了以下内容 (defun DOT-PRODUCT (a b) (if (or (null a) (null b)) 0 (+ (* (first a) (first b)) (DOT-PRODUCT (rest a) (rest b))))) 一切似乎都在运转;但是,它仍然适用于不同长度的列表。我

我刚开始学习LISP,我正试图找出如何编写下面的递归函数

我也该这么做吗

(DOT-PRODUCT '(1 2) '(3 4)))
输出应该是11

我写了以下内容

(defun DOT-PRODUCT (a b)
  (if (or (null a) (null b))
      0
      (+ (* (first a) (first b))
         (DOT-PRODUCT (rest a) (rest b)))))

一切似乎都在运转;但是,它仍然适用于不同长度的列表。我希望它只处理长度相同的数字列表。我应该在哪里添加返回“无效长度”的代码?如果我们有这样的代码,一个简单的方法是重写函数,以便它使用条件形式检查不同的情况:

(defun dot-product (a b)
  (cond ((null a) (if (null b) 0 (error "invalid length")))
        ((null b) (error "invalid length"))
        (t (+ (* (first a) (first b))
              (dot-product (rest a) (rest b))))))

cond
的第一个分支中,如果第一个参数是
NIL
,则第二个参数也必须是
NIL
,否则会生成错误。在第二个分支中,我们已经知道
a
不是
NIL
,因此会立即生成错误。最后,计算结果。

一个简单的方法是重写函数,以便它使用条件形式
cond
检查不同的情况:

(defun dot-product (a b)
  (cond ((null a) (if (null b) 0 (error "invalid length")))
        ((null b) (error "invalid length"))
        (t (+ (* (first a) (first b))
              (dot-product (rest a) (rest b))))))

cond
的第一个分支中,如果第一个参数是
NIL
,则第二个参数也必须是
NIL
,否则会生成错误。在第二个分支中,我们已经知道
a
不是
NIL
,因此会立即生成错误。最后,计算结果。

将列表X和Y的对应元素相乘:

(mapcar #'* X Y)
(mapcar #'* X Y)
添加列表Z的元素:

(reduce #'+ Z)
(reduce #'+ Z)
合计:dot产品:

(reduce #'+ (mapcar #'* X Y))
(reduce #'+ (mapcar #'* X Y))

将列表X和Y的对应元素相乘:

(mapcar #'* X Y)
(mapcar #'* X Y)
添加列表Z的元素:

(reduce #'+ Z)
(reduce #'+ Z)
合计:dot产品:

(reduce #'+ (mapcar #'* X Y))
(reduce #'+ (mapcar #'* X Y))

将列表X和Y的对应元素相乘:

(mapcar #'* X Y)
(mapcar #'* X Y)
添加列表Z的元素:

(reduce #'+ Z)
(reduce #'+ Z)
合计:dot产品:

(reduce #'+ (mapcar #'* X Y))
(reduce #'+ (mapcar #'* X Y))

reduce
mapcar
是“”概念的基础,这是一种对这类事物的概括,包括点积、卷积积分和多种数据处理和汇总方法。

将列表X和Y的对应元素相乘:

(mapcar #'* X Y)
(mapcar #'* X Y)
添加列表Z的元素:

(reduce #'+ Z)
(reduce #'+ Z)
合计:dot产品:

(reduce #'+ (mapcar #'* X Y))
(reduce #'+ (mapcar #'* X Y))

reduce
mapcar
是“”概念的基础,这是一种对这类事物的概括,包括点积、卷积积分和各种数据处理和汇总方法。

感谢您对使用cond而不是if的详细解释和建议。那真的很有帮助!感谢您对使用cond而不是if的详细解释和建议。那真的很有帮助!