我需要在clisp中做一个函数,把一个集合中的所有奇数相加。例如subset(2,8),结果是15(3+5+7)。有什么建议吗?
我确实有这样的东西,a是集合的开始,b是集合的结束。
(defun add (a b)
(if(and(< a x) (> b x))
(if(even(x))
((setq ( x (+a 1))) (+ x 2))
((setq(x a)) (+ x 2))
)))
编辑:
(defun add (a b)
(if(and(< a x) (> b x))
(if(evenp x))
((setq ( x (+a 1))
(loop for x from a to b do (+ x 2))))
((setq(x a)) (+ x 2)
(loop for x from a to b do (+ x 2)))
))
最佳答案
最直接的方法是使用LOOP
LOOP
的解决方案非常简单:
(defun sum-odds (start end)
(loop for i from start to end
when (oddp i) sum i))
(sum-odds 2 8)
=> 15
对于迭代,您也可以使用
DO
,但是您必须更明确地说明每件事是如何工作的(并且您有更多的选项):(defun sum-odds2 (begin end)
(do ((sum 0)
(i begin (1+ i)))
((= i end) sum)
(when (oddp i)
(incf sum i))))
(sum-odds2 2 8)
=> 15
如果您使用的解决方案确实创建了一个包含整数范围的列表(它创建了一堆要垃圾收集的中间列表),如其他一些答案中所建议的,那么您应该考虑遍历该列表的次数(没有理由遍历多次)您可以使用
REDUCE
用:key
参数对列表中的元素求和,该参数使奇数看起来像它们自己,而偶数看起来像0
:(defun sum-odds3 (list)
(reduce '+ list
:key (lambda (n)
(if (oddp n)
n
0))))
(sum-odds3 '(2 3 4 5 6 7 8))
=> 15
关于numbers - Lisp函数从子集中添加奇数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16413751/