我需要在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)))
                ))

最佳答案

最直接的方法是使用LOOPLOOP的解决方案非常简单:

(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/

10-13 06:08