Recursion 编写一个递归LISP函数,用于查找两个长度相同的数字列表的点积
我刚开始学习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))))) 一切似乎都在运转;但是,它仍然适用于不同长度的列表。我
(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的详细解释和建议。那真的很有帮助!