刚开始学习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)))))一切似乎都正常;然而,它仍然适用于不同长度的列表。我希望它只处理长度相同的数字列表。我应该在哪里添加返回“无效长度”的代码?
发布于 2016-10-03 06:51:09
一个简单的方法是重写函数,以便它使用条件形式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,因此会立即生成一个错误。最后对计算结果进行了计算。
发布于 2016-10-13 04:59:45
将列表X和Y的相应元素相乘:
(mapcar #'* X Y)添加列表Z的元素:
(reduce #'+ Z)加起来:点产品:
(reduce #'+ (mapcar #'* X Y))reduce和mapcar是"MapReduce“概念的基础,它是这类事物的推广,包括点积、卷积积分以及各种传递和总结数据的方法。
发布于 2022-08-08 21:41:37
通过引入累加器变量并将标准递归转换为尾递归,可以提高效率。在本例中,我使用(labels)来定义递归:
(defun DOT-PRODUCT (a b)
(labels ((dp (x y accum)
(if (or (null x) (null y))
accum
(dp (rest x) (rest y) (+ accum (* (first x) (first y)))))))
(if (= (length a) (length b))
(dp a b 0)
(error "Invalid length."))))https://stackoverflow.com/questions/39825848
复制相似问题