【问题标题】:Sum of odd elements in lisplisp中奇数元素的总和
【发布时间】:2015-03-24 04:27:09
【问题描述】:

我必须对奇数位置的奇数元素求和。这是行不通的。有人可以告诉我我的错误在哪里吗?谢谢

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

【问题讨论】:

  • “它不工作”是什么意思?
  • 为什么使用 mod if oddp 也能正常工作并且更清晰?

标签: lisp common-lisp


【解决方案1】:

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

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

您的原始解决方案在列表中向下移动了 cddr,这实际上是一种非常好的方法。您也可以使用 loop 来完成(对 rest 的初始调用只是为了让事情从索引 1 开始):

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

【讨论】:

  • @Baggers 是的 :) 它是:for-as-in-list::= var [type-spec] in form1 [by step-fun]
【解决方案2】:

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

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

为了避免这个错误,你可以使用函数 evenp 来代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多