编写一个递归 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))
reduce
和 mapcar
是“MapReduce”概念的基础,它是对包括点积、卷积积分和无数种方法的概括处理和汇总数据。
刚开始学习 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))
reduce
和 mapcar
是“MapReduce”概念的基础,它是对包括点积、卷积积分和无数种方法的概括处理和汇总数据。