Lisp SICP-加法乘法

Lisp SICP-加法乘法,lisp,racket,sicp,Lisp,Racket,Sicp,我正在使用SICP一书,并试图解决此练习: 练习1.18。使用练习1.16和1.17的结果,设计 一种产生一个迭代过程以使两个数相乘的过程 整数的加法、乘法和减半运算,并使用 对数步数 我试图用以下代码解决此问题: (define (double x) (+ x x)) (define (halve x) (floor (/ x 2))) (define (* a b) (define (iter count accumulate) (cond ((= count 1

我正在使用SICP一书,并试图解决此练习:

练习1.18。使用练习1.16和1.17的结果,设计 一种产生一个迭代过程以使两个数相乘的过程 整数的加法、乘法和减半运算,并使用 对数步数

我试图用以下代码解决此问题:

(define (double x) 
  (+ x x))

(define (halve x) 
  (floor (/ x 2)))

(define (* a b)
  (define (iter count accumulate)
    (cond ((= count 1) accumulate)
          ((even? a) (iter (halve count) (+ accumulate (double b))))
          (else empty)))
  (iter a 0))
正如你可能看到的,我试图先处理偶数。 我在用电脑。他们建议进行一些测试,看看代码是否有效:

 (* 2 4) 
 (* 4 0) 
我没有得到的是,我的代码通过了前两个测试,只处理偶数

然而,当我尝试一些大的数字,这是两的倍数,代码失败。我用Python检查了结果。比如说,

(IN PYTHON)

2**100  
>> 1267650600228229401496703205376  
2**98
>> 316912650057057350374175801344
a = 2**100
b = 2**98
a*b
>> 401734511064747568885490523085290650630550748445698208825344
当我在Dr.Racket中使用这些值的函数时,会得到不同的结果:

(* 1267650600228229401496703205376 316912650057057350374175801344)
我的结果是:6338253001411470074835160268800,正如Python内置函数所表明的那样,这是错误的


为什么会发生这种情况?

递归步骤似乎是错误的,而
空的
在那里做什么?另外,如果
b
为负值,会发生什么情况?这一解决方案应在以下方面发挥作用:

(define (mul a b)
  (define (iter a b acc)
    (cond ((zero? b) acc)
          ((even? b) (iter (double a) (halve b) acc))
          (else (iter a (- b 1) (+ a acc)))))
  (if (< b 0)
      (- (iter a (- b) 0))
      (iter a b 0)))
(mul 1267650600228229401496703205376 316912650057057350374175801344)
=> 401734511064747568885490523085290650630550748445698208825344