我正在尝试编写一个函数,它将 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/