OS XのインタプリタでSchemeの練習をしていGuile 1.8.8
たところ、面白いことに気がつきました。
expt
基本的に累乗を行う関数は次のexpt(b,n) = b^n
とおりです。
(define (square x) (* x x))
(define (even? x) (= (remainder x 2) 0))
(define (expt b n)
(cond ((= n 0) 1)
((even? n) (square (expt b (/ n 2))))
(else (* b (expt b (- n 1))))
))
いくつかの入力で試してみると
> (expt 2 10)
1024
> (expt 2 63)
9223372036854775808
ここに奇妙な部分があります:
> (expt 2 64)
0
さらに奇妙なことに、n=488
にとどまるまで0
:
> (expt 2 487)
0
> (expt 2 488)
79916762888089401123.....
> (expt 2 1000)
1071508607186267320948425049060....
> (expt 2 10000)
0
このコードをrepl.itオンライン インタープリターで試すと、期待どおりに動作します。では、ガイルの何が問題なのですか?
(注: 一部の方言では、remainder
function は として呼び出されmod
ます。)