我正在使用SICP一书,试图解决这个问题:
1.2.4 Exponentiation
练习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))

如你所见,我想先处理偶数。
我正在使用SICP wiki as my solutions-guide他们建议进行一些测试,看看代码是否有效:
 (* 2 4)
 (* 4 0)

我没有得到的是,我的代码通过了这两个最初的测试,只处理偶数。
然而,当我尝试一些两倍的大数字时,代码失败了我用Python检查了结果例如,
(IN PYTHON)

2**100
>> 1267650600228229401496703205376
2**98
>> 316912650057057350374175801344
a = 2**100
b = 2**98
a*b
>> 401734511064747568885490523085290650630550748445698208825344

当我在Racket博士的函数中使用这些值时,我得到了不同的结果:
(* 1267650600228229401496703205376 316912650057057350374175801344)

我的结果是:6338253001411470074835160268800,这是错误的,正如Python内置函数所建议的那样。
为什么会这样?

最佳答案

递归步骤似乎是错误的,那empty在那里做什么另外,如果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

08-04 00:12