问题描述
我将如何在 sicp/scheme/dr 中执行以下操作?球拍?
(define (even? n) (= (% n 2) 0))
目前看来这不是一个原始符号:%: unbound identifier in: %
。
这可能是世界上最愚蠢的方法,但没有 %
或按位 -&1
我正在做(没有日志或其他任何东西):
(define (even? n)
(if (< (abs n) 2)
(= n 0)
(even? (- n 2))))
解决方法
mod
在方案中为 modulo
:
(define (even? n)
(= (modulo n 2) 0))
,
我认为,当感觉“缺少”程序时,习惯编写自己的程序是一种很好的做法。您可以将自己的 mod
实现为 -
(define (mod a b)
(if (< a b)
a
(mod (- a b) b)))
(mod 0 3) ; 0
(mod 1 3) ; 1
(mod 2 3) ; 2
(mod 3 3) ; 0
(mod 4 3) ; 1
(mod 5 3) ; 2
(mod 6 3) ; 0
(mod 7 3) ; 1
(mod 8 3) ; 2
但也许我们可以通过支持负数和防止调用者被 divi 来使它更健壮
(define (mod a b)
(if (= b 0)
(error 'mod "division by zero")
(rem (+ b (rem a b)) b)))
(define (rem a b)
(cond ((= b 0)
(error 'rem "division by zero"))
((< b 0)
(rem a (neg b)))
((< a 0)
(neg (rem (neg a) b)))
((< a b)
a)
(else
(rem (- a b) b))))