如何解决如何在方案中取模
我将如何在 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))))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。