如何在方案中取模

问题描述

我将如何在 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))))