题
我刚刚开始通过 SICP(靠我自己;这不是为了上课),我已经在练习 1.6 上苦苦挣扎了几天,但我似乎无法弄清楚。这是Alyssa重新定义的 if
按照 cond
, ,像这样:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause))
她在一些简单的情况下成功地测试了它,然后用它来重写平方根程序(这与 if
):
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
接下来的问题是:“当 Alyssa 尝试用它来计算平方根时会发生什么?解释一下。”[如果有必要,我很乐意重现其他程序(good-enough?
, improve
, 等),请告诉我。]
现在,我知道会发生什么:它从不返回值,这意味着程序无限递归。我只是无法解释为什么会发生这种情况。无论两者之间存在什么细微的差别 if
和 new-if
正在躲避我。非常感谢任何和所有的帮助。
解决方案
new-if
是一个函数。当一个函数被调用,那是什么方案并与参数列表中的第一件事情?它评估的所有的参数。
其他提示
new-if
是一个程序,及方案使用应用性阶评价(1.1.5),因此,即使前实际进行new-if
,它必须首先评估所有的参数,这是guess
和(sqrt-iter (improve guess x) x)
。可以看到,后者参数是一个递归,它调用一个新的程序new-if
,这是无限循环如何发生。
在普通if
不必先评估其参数,只是一路上去,这是if
和new-if
之间的差异。 :)
首先你必须 理解其中的区别 应用顺序评估和正常顺序之间。Lisp 使用应用顺序,但条件表达式的计算方式与普通函数不同(SICP 第 1.1.6 章):
(if <predicate> <consequent> <alternative>)
为了评估 if 表达式,解释器首先评估
<predicate>
表达式的一部分。如果<predicate>
评估为真值,然后解释器评估<consequent>
并返回它的值。否则它评估<alternative>
并返回它的值。
Ex1.6。新如果:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
差分与“if语句”: if语句谓词从评价逐个 - >结果 - >替代方案中,
然而“新-如果”具有以评估又名参数的所有参数的时刻其称为(这意味着“else从句”在开始!!被评估),
和因此这会导致无限循环时任何这些参数自称为迭代循环