如何在方案中进行取模

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))