lancerex

导航

 

问题:

Eva定义new-if:
(define (new-if predicate then-clause else-clause)
      (cond (predicate then-clause)
                (else else-clause)))

运算

(define (sqrt-iter guess x)
  (new-if (good-enough? guess x)
              guess
              (sqrt-iter (improve guess x)
                          x)))

将出现什么问题?

解答:
由于之前在网上查找过关于sicp1.5习题的解答, 所以看到sicp1.6就想到了是Applicative order 和 Normal order之间的问题
new-if是scheme定义的过程, 计算时采用的是应用序(Applicative order)
if是scheme中的基本运算符, 计算时采用的是正则序(Normal order)
根据应用序和正则序的定义, new-if会一直展开else-clause, 造成栈溢出
而if则当predicate为false时, 才去展开else-clause, 可以进行递归运算
由此让我联想到SICP中文版中讲Applicative order 和 Normal order时说过的一句话:
正则序是特别有价值的工具.
而if就是最好的例子, 有了if的正则序计算, 递归就得以实现.

posted on 2013-03-13 23:27  lancerex  阅读(718)  评论(1)    收藏  举报