SICP练习1.17问题
SICP exercise 1.17 issue
我正在做 SICP 中的练习 1.18,我遇到了一些麻烦。目标是根据之前的 2 个练习制定程序。这个过程实现了所谓的俄罗斯农民方法(或古埃及乘法)。我写了一段代码,但是一个过程就是不想执行。这是我的代码:
#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 13 19)
调用过程 (r_m)
时,它会在第一次迭代后停止。
(iter (halve a) (double b) (+ n b)
(参数 13 和 19)给出了这个结果:iter (13/2) 38 19
之后,程序会尝试检查 13/2 是否为奇数。但它无法检查这样的数字 (13/2),因为 odd?
需要一个整数,而不是这个未完成的除法。
由于某种原因,halve
过程在调用时不起作用。我真的不明白为什么,因为其他程序(double
和简单的 + n b
)工作正常。
提前谢谢你,希望我的语法不会对你造成太大伤害。
您的程序有几处错误。别的不说,就算halve
按照你希望的方式工作,b
怎么会变成零呢?这不是唯一的问题!
然而,halve
的特殊情况发生是因为您假设编程语言会做它们通常做的事情:对机器方便的不正确算术,而不是对人类方便的正确算术。 Scheme 努力做到正确 算术。从数学上讲,13/2 是多少?它不是 6、7 或 3,而是 13/2 或 6 + 1/2:这是一个有理数,而不是整数。
如果你想要下一个小于 13/2 的整数,你想要得到它的方法是在除法之前减去 1:(减半 (- 13 1)) 正好是 6。因此,如果您将 cond
子句更改为 (halve (- a 1))
您的程序将更接近于工作(但实际上它将无法终止,因此从某种意义上说它将更远离工作...... ).
我正在做 SICP 中的练习 1.18,我遇到了一些麻烦。目标是根据之前的 2 个练习制定程序。这个过程实现了所谓的俄罗斯农民方法(或古埃及乘法)。我写了一段代码,但是一个过程就是不想执行。这是我的代码:
#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 13 19)
调用过程 (r_m)
时,它会在第一次迭代后停止。
(iter (halve a) (double b) (+ n b)
(参数 13 和 19)给出了这个结果:iter (13/2) 38 19
之后,程序会尝试检查 13/2 是否为奇数。但它无法检查这样的数字 (13/2),因为 odd?
需要一个整数,而不是这个未完成的除法。
由于某种原因,halve
过程在调用时不起作用。我真的不明白为什么,因为其他程序(double
和简单的 + n b
)工作正常。
提前谢谢你,希望我的语法不会对你造成太大伤害。
您的程序有几处错误。别的不说,就算halve
按照你希望的方式工作,b
怎么会变成零呢?这不是唯一的问题!
然而,halve
的特殊情况发生是因为您假设编程语言会做它们通常做的事情:对机器方便的不正确算术,而不是对人类方便的正确算术。 Scheme 努力做到正确 算术。从数学上讲,13/2 是多少?它不是 6、7 或 3,而是 13/2 或 6 + 1/2:这是一个有理数,而不是整数。
如果你想要下一个小于 13/2 的整数,你想要得到它的方法是在除法之前减去 1:(减半 (- 13 1)) 正好是 6。因此,如果您将 cond
子句更改为 (halve (- a 1))
您的程序将更接近于工作(但实际上它将无法终止,因此从某种意义上说它将更远离工作...... ).