sicp - 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
“纸”调试没有帮助: (* 2 2) -> mult-iter 0 2 2 -> (b is even so) mult-iter 0 4 1 -> (b is not even) -> 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))
推荐阅读
- numbers - 当逗号用作小数分隔符时,数字分隔符是什么?
- apache-kafka - kafka connect 变换base64decode一个字段
- ios - 在 Swift 中使用来自单独视图控制器的变量
- java - 在循环内初始时返回循环外的值
- express - 为什么我从 req.body.newItem 得到空字符串?
- c++ - 为什么我总是在我的代码中返回位置 10?
- docker - WSL2 中的 Docker:无法在 tcp://localhost:2375 连接到 Docker 守护程序。docker 守护进程是否正在运行?
- c - 为什么当我重复调用它 l 30 次时 realloc() 返回 NULL?
- r - 无法使用 ggtree 绘制 hclust 对象
- java - 使用 FXML 在 JavaFX 中绘制线条