sum - 基本 Lisp 函数 - 偶数和减去奇数和

标签 sum lisp common-lisp

我正在尝试编写一个函数,它将 List 作为参数并计算 偶数之和 减去 奇数之和。 这是我的实现,但我不知道为什么它没有按预期工作,你能给我任何关于错误的提示吗?

(defun sumEvenOdd (R)
  (cond
    ((NULL R) 0)
    ((and (ATOM (CAR R)) (= (mod (CAR R) 2) 0))
              (+ (CAR R) (sumEvenOdd (CDR R))))
    ((and (ATOM (CAR R)) (not (= (mod (CAR R) 2) 0)))
              (- (CAR R) (sumEvenOdd (CDR R)) ))
    ((LISTP (CAR R)) (sum (sumEvenOdd  (CAR R)) (sumEvenOdd  (CDR R))))
    (T  (sumEvenOdd  (CDR R)))
  )
)

最佳答案

关于代码算法,它失败了,因为数学是如何完成的。 现在的代码是这样的,这个对列表 (list 1 2 3 4 5) 进行的评估是 (- 1 (+ 2 (- 3 (+ 4 (- 5 0))))) 等于 5。 我们期望的是 (2+4)-(1+3+5) 等于 -3。怎么了? 基本上数学中的加法运算是可交换的,而减法运算则不是。 1+5和5+1是一样的。 1-5 和 5-1 不是。 这反射(reflect)了最后一个操作的代码,其中 5 被减去 0。

最简单的解决方案是调整操作顺序,切换参数。

(defun sumEvenOdd (R)
  (cond
    ((NULL R) 0)
    ((and (ATOM (CAR R)) (= (mod (CAR R) 2) 0))
              (+ (sumEvenOdd (CDR R)) (CAR R)))
    ((and (ATOM (CAR R)) (not (= (mod (CAR R) 2) 0)))
              (- (sumEvenOdd (CDR R)) (CAR R)))
  )
)

这样,评估将是:(- (+ (- (+ (- 0 1) 2) 3) 4) 5) 等于 -3。

PS:您可以在这里检查和测试代码:http://goo.gl/1cEA5i

关于sum - 基本 Lisp 函数 - 偶数和减去奇数和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473770/

相关文章:

sql-server - sum(DATALENGTH) 返回 "Arithmetic overflow"错误

awk - 是否有可以处理 s 表达式流的类似 Awk 或 Lisp 的编程语言?

elisp - 符号的函数定义为 void : incf (common lisp function in emacs24)

lisp - 无法访问用 make-package 定义的新包中的 CL-USER 符号?

java - 如何对 HashMap 中重复出现的键关联的值求和

python - 在 Python 3.x 中对二维数组求和

来自 AS 列的 MySQL SUM 和 GROUP BY

Clojure 中的宏、评估和引用

lisp - '(a b c) and (list ' 和 'b ' c) 有什么区别?

lisp - 增加 Mac Common Lisp 5.0 中的最小堆栈溢出大小