【发布时间】:2019-10-26 11:23:53
【问题描述】:
所以我是 LISP 的新手,我想知道如何找到可被 3 整除的数字的总和。 这是我到目前为止所做的:
(defun sumel (li)
(cond
((null li) 0)
( (zerop (rem (car li) 3)) (+ (car li) (sumel (cdr li))))
)
)
对我做错的事情有一点提示会很棒。
【问题讨论】:
标签: lisp common-lisp
所以我是 LISP 的新手,我想知道如何找到可被 3 整除的数字的总和。 这是我到目前为止所做的:
(defun sumel (li)
(cond
((null li) 0)
( (zerop (rem (car li) 3)) (+ (car li) (sumel (cdr li))))
)
)
对我做错的事情有一点提示会很棒。
【问题讨论】:
标签: lisp common-lisp
当列表为空并且实际找到 3 的倍数时,您可以避免这种情况,但如果它是另一个您应该跳过的数字会发生什么?你已经做了默认术语,所以 Common Lisp 将返回nil。例如,您的代码是这样工作的:
(defun sumel (li)
(cond
((null li) 0)
((zerop (rem (car li) 3))
(+ (car li) (sumel (cdr li))))
(t nil))) ; when not a multiple of 3 we are finished, return nil
尝试评估(cond),您会发现它与(cond (t nil)) 相同。
您可以通过添加 (sumel (cdr l)) 作为替代来解决此问题。它应该评估为列表其余部分的倍数之和,这就是您想要的。
【讨论】:
您还可以采用不同的方法,利用 Common Lisp 的大型标准库(在本例中为 remove-if-not 和 reduce)
(defun sumel (list)
(reduce '+ (remove-if-not (lambda (x) (zerop (rem x 3)))
list)))
【讨论】: