乐正

Actions speak louder than words.

Sicp-ex1-6

问题

Alyssa P. Hacker 看不出为什么需要将if提供为一种特殊形式,她问:“为什么我不能直接 通过cond将它定义为一个常规过程呢?” Alyssa的朋友Eva Lu Ator断言确实可以这样做, 并定义了if的一个新版本:

1
2
3
(define (new-if predicate then-clause else-clause)
  (cond (predicate then-clause)
        (else else-clause)))

Eva给Alyssa演示她的程序:

1
2
3
4
5
(new-if (= 2 3) 0 5)
;Value: 5

(new-if (= 1 1) 0 5)
;Value: 0

她很高兴的用自己的new-if重写了求平方根的程序:

1
2
3
4
5
(define (sqrt-iter guess x)
  (new-if (good-enough? guess x)
          guess
          (sqrt-iter (improve guess x)
                     x)))

当Alyssa试着用这个程序去计算平方根时会发生什么事情呢?请给出解释。

解答

由于解释器使用的是“先求值参数而后应用”的应用序求值方式,所以new-if中,无论 predicate值是什么,then-clause和else-clause中的参数都会被计算,这样sqrt-iter调 用会无限递归下去,直到超过超过最大递归深度,程序错误退出。

draft

« sicp-ex1-5 sicp-ex1-7 »

Comments