我正在做SICP的1.18练习,我遇到了一些麻烦。目的是在之前的两个练习的基础上制定一个程序。这个程序实现所谓的俄罗斯农民方法(或古埃及乘法)。我写了一段代码,但有一个程序不想执行。这是我的密码:
#lang sicp
(define (double a) (+ a a))
(define (halve a) (/ a 2))
(define (r_m a b)
(iter a b 0))
(define (iter a b n)
(cond ((= b 0) 0)
((even? a) (iter (halve a) (double b) (+ n b)))
(else (iter (halve a) (double b) n))))所以,当我用这样的参数调用过程(r_m)时,(r_m 13 19)在第一次迭代之后停止。(iter (halve a) (double b) (+ n b) (带有参数13和19)给出了这个结果:iter (13/2) 38 19
在此之后,程序试图检查13/2是否是奇数。但是它不能检查这样的数字(13/2),因为odd?需要一个整数,而不是这个未完成的除法。
由于某些原因,halve过程在调用时无法工作。我真的不明白为什么,因为其他过程(double和简单的+ n b)工作得很好。
先谢谢你,我希望我的语法不会给你带来太大的伤害。
发布于 2020-08-31 16:39:13
你的程序有几处问题。除此之外,即使halve按照您希望的方式工作,b怎么会变成零呢?这不是唯一的问题!
然而,发生halve的特殊情况是因为您假设编程语言可以做他们通常做的事情:不正确的算术对机器来说是方便的,而不是对人类方便的正确的算术。方案试图做正确的算术。什么,在数学上,是13/2?它不是6,7,3,它是13/2,或6+ 1/2:它是一个有理数,不是整数。
如果你想得到13/2以下的下一个整数,你想得到它的方法是在除以之前减去1:(减半(- 13.1))是6,准确。因此,如果您将该cond子句更改为使(halve (- a 1))更接近于工作(但是,实际上它将无法终止,所以从某种意义上说,它将远离工作.)。
https://stackoverflow.com/questions/63673855
复制相似问题