【问题标题】:SICP exercise 1.18SICP 练习 1.18
【发布时间】:2021-05-23 23:31:21
【问题描述】:

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

(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 is even so) mult-iter 0 4 1 -> (b is not even) -> mult-iter 4 4 0 -> (b is equal到 0) 4.

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

【问题讨论】:

  • 请复制您要解决的问题的陈述。

标签: sicp


【解决方案1】:

问题出在这里:

(define (double x) (* x 2))

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

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

或者,定义double 而不使用*,但我更喜欢前一种方法:

(define (double x) (+ x x))

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2011-11-05
    • 2017-02-03
    • 2010-12-26
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多