SICP练习1.6的解释是什么?
我刚刚开始通过SICP(我自己,这不是一个class)工作,我一直在练习1.6几天,我似乎无法弄清楚。 这就是Alyssa用cond
重新定义的一个cond
,就像这样:
(define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))
她在一些简单的情况下成功地testing了它,然后用它来重新编写平方根程序( if
工作得很好):
(define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))
接下来的问题是:“当Alyssa试图用这个来计算平方根时会发生什么?解释。” [如果有必要,我很乐意再现其他程序( good-enough?
, improve
等),请让我知道。]
现在,我知道发生了什么:它永远不会返回一个值,这意味着程序无限recursion。 我无法解释为什么会发生这种情况。 无论new-if
和new-if
之间存在着细微的差别 任何和所有的帮助非常感谢。
new-if
是一个function。 当函数被调用时,Scheme对参数列表做的第一件事情是什么? 它评估所有的论点。
new-if
是一个过程,Scheme使用应用顺序评估(1.1.5),所以即使在new-if
实际执行之前,它也必须首先评估所有的参数,这是guess
和(sqrt-iter (improve guess x) x)
。 你可以看到后一个参数是一个recursion,它调用一个新的new-if
过程,这就是无限循环的发生。
普通的if
不需要首先评估它的参数,那么只是沿着这条路走,这是if
和new-if
的区别。 🙂
首先,你必须了解适用订单评估和正常订单之间的区别 。 Lisp使用适用的顺序,但条件expression式的评估不像正常函数( sicp章节1.1.6 ):
(if <predicate> <consequent> <alternative>)
为了评估一个ifexpression式,解释器首先评估expression式的
<predicate>
部分。 如果<predicate>
计算结果为一个真值,则解释器将评估<consequent>
并返回其值。 否则,它将评估<alternative>
并返回其值。