lisp中奇数元素的总和

时间:2015-03-24 04:27:10

标签: lisp common-lisp

我必须对奇数位置上的奇数元素求和。这不起作用。谁能告诉我我的错误在哪里?谢谢

(defun sum (list)
  (cond
    ((null list) 0)
    ((= (mod 2 (car list)) 0) (sum (cddr list)))
    (T (+ (car list) (sum (cddr list))))))

2 个答案:

答案 0 :(得分:6)

您的原始定义(奇数位置的奇数元素)实际上非常干净地转换为循环

(loop for i from 0 
  for x in '(0 1 2 3 4 5 6)
  when (and (oddp i) (oddp x))
  sum x)

您的原始解决方案通过 cddr 向下移动,这实际上是一种非常好的方法。您也可以使用循环来执行此操作(对 rest 的初始调用只是为了在索引1处启动):

(loop for x in (rest '(0 1 2 3 4 5 6)) by #'cddr
   when (oddp x)
   sum x)

答案 1 :(得分:4)

检查函数mod的参数顺序。它应该是:

(= (mod (car list) 2) 0)

为避免此错误,您可以改为使用函数evenp。