如何在方案中进行取模
How to do modulo in scheme
我将如何在 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
实现为 -
(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))))
mod
在方案中是 modulo
:
(define (even? n)
(= (modulo n 2) 0))
我将如何在 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
实现为 -
(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))))
mod
在方案中是 modulo
:
(define (even? n)
(= (modulo n 2) 0))