lisp中奇数元素的总和

Mar*_*ina 0 lisp common-lisp

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

(defun sum (list)
  (cond
    ((null list) 0)
    ((= (mod 2 (car list)) 0) (sum (cddr list)))
    (T (+ (car list) (sum (cddr list))))))
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 6

你原来的定义(在奇数位置加上奇数元素)实际上非常干净地转换成一个循环:

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

您的原始解决方案通过cddr向下移动到列表中,这实际上是一种非常好的方法.你也可以用循环来做(最初的休息调用只是为了在索引1开始):

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