我刚刚开始通过 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, 等),请告诉我。]

现在,我知道会发生什么:它从不返回值,这意味着程序无限递归。我只是无法解释为什么会发生这种情况。无论两者之间存在什么细微的差别 ifnew-if 正在躲避我。非常感谢任何和所有的帮助。

有帮助吗?

解决方案

new-if是一个函数。当一个函数被调用,那是什么方案并与参数列表中的第一件事情?它评估的所有的参数。

其他提示

new-if是一个程序,及方案使用应用性阶评价(1.1.5),因此,即使前实际进行new-if,它必须首先评估所有的参数,这是guess(sqrt-iter (improve guess x) x)。可以看到,后者参数是一个递归,它调用一个新的程序new-if,这是无限循环如何发生。

在普通if不必先评估其参数,只是一路上去,这是ifnew-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从句”在开始!!被评估),

和因此这会导致无限循环时任何这些参数自称为迭代循环

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top