Scheme SICP练习1.17发布

Scheme SICP练习1.17发布,scheme,racket,sicp,Scheme,Racket,Sicp,我正在做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)

我正在做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(a减半)(b加倍)(+nb)
(带参数13和19)给出了这个结果:
iter(13/2)3819

之后,程序尝试检查13/2是否为奇数。但它无法检查这样的数字(13/2),因为
odd?
需要一个整数,而不是这个未完成的除法

出于某种原因,
halve
过程在调用时不起作用。我真的不明白为什么,因为其他过程(
double
和simple
+nb
)工作正常


提前谢谢您,我希望我的语法不会对您造成太大的伤害。

您的程序有几处问题。除此之外,即使
halve
按您希望的方式工作,它怎么会变为零?这不是唯一的问题

然而,
halve
的特殊情况之所以发生,是因为你假设编程语言做他们通常做的事情:对机器来说是不正确的算术,而不是对人类来说是正确的算术。Scheme努力做正确的算术。从数学上讲,13/2是什么?它不是6,oR7,或3,它是13/2,或6+1/2:它是一个有理数,不是整数


如果你想让下一个整数小于13/2,得到它的方法是先减去1再除以:(halve(-13 1))正好是6。所以如果你把
cond
子句改为
(halve(-a 1))
,你的程序将更接近正常运行(但事实上,它将无法终止,因此从某种意义上说,它将无法工作……。

感谢您的帮助。我更改了
对半部分,添加了
cond
,以检查数字是否为奇数(如果是,则为-a1)。然后将此
(cond(=b0)0)
更改为此
(cond(=a0)n)
。该程序现在按预期工作。对于数字13和19,它返回正确答案:247。谢谢!