【发布时间】:2013-01-07 20:55:51
【问题描述】:
我在 OS X 上的 Guile 1.8.8 解释器中练习 Scheme。我发现了一些有趣的东西。
这是 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 在线解释器尝试此代码时,它按预期工作。那么Guile到底怎么了?
(注意:在某些方言中,remainder 函数称为mod。)
【问题讨论】:
-
你怎么有(expt 2 64)两次,第一次是0,然后不是(79916762888089401123.....)
-
尝试将您的
expt重命名为my-expt。只是为了排除关于问题是您的expt还是内置的expt的任何混淆。 -
通常
remainder和modulo对负数的工作方式不同。 -
您的代码将 (expt 2 488) 计算为 (expt 2 244) 的平方。由于 (expt 2 488) 没有被报告为零,我敢打赌,你看到的是 display 而不是 computation。如果你要求类似 (zerop (expt 2 100)) 会发生什么?
-
更多信息以防万一有用:我刚刚在运行 FreeBSD 的 x64 机器上在 guile 1.8.8 中进行了尝试,一切正常。 ahmet alp balkan,你的机器是 64 位的吗? (最近的 Mac 是。)如果是这样,那么问题可能是特定于 OS X 的。
标签: scheme mit-scheme guile