编写一个递归 LISP 函数,计算两个相同长度数字列表的点积

Write a recursive LISP function that finds the dot product of two lists of numbers of same length

刚开始学习 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)))))

而且一切似乎都正常;但是,它仍然适用于不同长度的列表。我希望它只适用于具有相同长度的数字列表。我应该在哪里添加代码 returns "invalid length" 我们应该有这样的吗?

一个简单的方法是重写函数,以便它使用条件形式 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)

添加列表元素 Z:

(reduce #'+ Z)

放在一起:点积:

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

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

(mapcar #'* X Y)

添加列表元素 Z:

(reduce #'+ Z)

放在一起:点积:

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

reducemapcar 是“MapReduce”概念的基础,它是对包括点积、卷积积分和无数种方法的概括处理和汇总数据。