我正在使用SICP一书,并试图解决这个问题:
1.2.4指数 练习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作为我的解决方案-指南。他们建议进行一些测试,看看代码是否有效:
(* 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)我的结果是: 63382530011411470074835160268800,这是错误的,正如Python内置函数所暗示的那样。
为什么会发生这种事?
发布于 2016-09-12 02:01:19
递归步骤似乎是错误的,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)
=> 401734511064747568885490523085290650630550748445698208825344https://stackoverflow.com/questions/39441958
复制相似问题