如何解决SICP 练习 1.18
我的解决方案有什么问题?
(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))
当我运行这个解释器失败时:
1 ]=> (load "e1.18.scm")
;Loading "e1.18.scm"... done
;Value: *
1 ]=> (* 2 2)
;Aborting!: maximum recursion depth exceeded
“Paper”调试没有帮助: (* 2 2) -> mult-iter 0 2 2 -> (b 是偶数) mult-iter 0 4 1 -> (b 不是偶数) -> mult-iter 4 4 0 -> (b 是相等的到 0) 4.
结果应该是4,哪里可以无限递归?
解决方法
问题出在这里:
(define (double x) (* x 2))
您使用的 *
过程与您在下面定义的过程相同!这导致循环递归。通常,使用现有的内置名称来命名过程并不是一个好主意。您应该重命名您的新定义:
(define (mul a b)
(mult-iter 0 a b))
或者,在不使用 double
的情况下定义 *
,但我更喜欢以前的方法:
(define (double x) (+ x x))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。