首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP -加法乘法

SICP -加法乘法
EN

Stack Overflow用户
提问于 2016-09-12 00:30:27
回答 1查看 143关注 0票数 2

我正在使用SICP一书,并试图解决这个问题:

1.2.4指数 练习1.18.使用练习1.16和1.17的结果,设计一个过程,生成一个迭代过程,在相加、加倍和减半的情况下,将两个整数相乘,并使用一个对数步骤数

我试图用以下代码来解决这个问题:

代码语言:javascript
复制
(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作为我的解决方案-指南。他们建议进行一些测试,看看代码是否有效:

代码语言:javascript
复制
 (* 2 4) 
 (* 4 0) 

我不明白的是,我的代码通过了这两个第一次测试,只处理偶数。

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

代码语言:javascript
复制
(IN PYTHON)

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

当我用这些值在Racket博士内部使用我的函数时,我得到了一个不同的结果:

代码语言:javascript
复制
(* 1267650600228229401496703205376 316912650057057350374175801344)

我的结果是: 63382530011411470074835160268800,这是错误的,正如Python内置函数所暗示的那样。

为什么会发生这种事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 02:01:19

递归步骤似乎是错误的,empty在那里做什么呢?另外,如果b是负的,会发生什么?这一解决办法应该有效:

代码语言:javascript
复制
(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)))

例如:

代码语言:javascript
复制
(mul 1267650600228229401496703205376 316912650057057350374175801344)
=> 401734511064747568885490523085290650630550748445698208825344
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39441958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档