刚开始学习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)))))
一切似乎都有效;但是,它仍然适用于不同长度的列表。我希望它只处理具有相同长度的数字列表。我应该在哪里添加返回“无效长度”的代码呢?
一种简单的方法是重写该函数,以便它使用条件形式检查不同的情况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
,因此会立即生成错误。最后,计算结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句