首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP练习1.18

SICP练习1.18
EN

Stack Overflow用户
提问于 2021-02-21 22:55:45
回答 1查看 26关注 0票数 0

我的解决方案有什么问题?

代码语言:javascript
复制
(define (halve x) (/ x 2))
(define (double x) (* x 2))

(define (mult-iter acc a b)
  (cond ((= b 0) acc)
        ((even? b) (mult-iter acc (double a) (halve b)))
        (else (mult-iter (+ a acc) a (- b 1)))))

(define (* a b)
  (mult-iter 0 a b))

当我运行这个interpriter失败时:

代码语言:javascript
复制
1 ]=> (load "e1.18.scm")

;Loading "e1.18.scm"... done
;Value: *

1 ]=> (* 2 2)

;Aborting!: maximum recursion depth exceeded

"Paper“调试没有帮助:(*2) ->多项式0 2 2 -> (b是偶数)多项式0 4 1 -> (b不是偶数) ->多项式4 4 0 -> (b等于0) 4.

结果应该是4,哪里可以得到无限递归?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-22 01:00:46

问题出在这里:

代码语言:javascript
复制
(define (double x) (* x 2))

The*您正在使用的过程与您在下面定义的过程是相同的!这会导致循环递归。一般来说,使用现有的内置名称来命名过程并不是一个好主意。您应该重命名您的新定义:

代码语言:javascript
复制
(define (mul a b)
  (mult-iter 0 a b))

或者,定义double不使用*,但我更喜欢前面的方法:

代码语言:javascript
复制
(define (double x) (+ x x))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66303583

复制
相关文章

相似问题

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