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-ifnew-if之间存在着细微的差别 任何和所有的帮助非常感谢。

new-if是一个function。 当函数被调用时,Scheme对参数列表做的第一件事情是什么? 它评估所有的论点。

new-if是一个过程,Scheme使用应用顺序评估(1.1.5),所以即使在new-if实际执行之前,它也必须首先评估所有的参数,这是guess(sqrt-iter (improve guess x) x) 。 你可以看到后一个参数是一个recursion,它调用一个新的new-if过程,这就是无限循环的发生。

普通的if不需要首先评估它的参数,那么只是沿着这条路走,这是ifnew-if的区别。 🙂

首先,你必须了解适用订单评估和正常订单之间的区别 。 Lisp使用适用的顺序,但条件expression式的评估不像正常函数( sicp章节1.1.6 ):

 (if <predicate> <consequent> <alternative>) 

为了评估一个ifexpression式,解释器首先评估expression式的<predicate>部分。 如果<predicate>计算结果为一个真值,则解释器将评估<consequent>并返回其值。 否则,它将评估<alternative>并返回其值。