什么是锻炼1.6 SICP如何解释呢?(What's the explanation for

2019-07-30 16:08发布

我刚刚开始通过SICP工作(我自己,这是不是一类),我一直在用练习1.6挣扎了几天,我刚才似乎无法推测出来。 这是一个其中阿莉莎重新定义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)))

那么接下来的问题问:“当阿丽莎试图以此来计算平方根说明会发生什么?”。 [如果有必要,我很高兴能重现其他程序( good-enough?improve等),只是让我知道。]

现在,我知道会发生什么:它永远不会返回一个值,这意味着程序无限递归。 我无法解释为什么会这样。 无论微妙的差异之间存在ifnew-if是躲避我。 任何和所有帮助非常感激。

Answer 1:

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



Answer 2:

new-if是一个过程,并计划使用应用性,为了评价(1.1.5),所以即使前new-if实际执行,它必须首先评估所有的参数,这是guess(sqrt-iter (improve guess x) x) 。 你可以看到,后者的说法是一个递归,它调用一个新的new-if的程序,这是无限循环是如何发生的。

普通的if不用先评估其参数,只是一路上去,这之间的区别ifnew-if 。 :)



Answer 3:

首先,你必须理解上的差异合用的顺序评估和正常秩序之间。 Lisp的应用性使用顺序,但条件表达式求值不象正常功能( SiC颗粒章节1.1.6 ):

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

为了评估一个if语句,解释器通过评估开始<predicate>的表达式的一部分。 如果<predicate>计算结果为真值,解释器然后计算<consequent>和返回它的值。 否则,它评估<alternative>和返回它的值。



Answer 4:

Ex1.6。 新-IF:

(define (new-if predicate then-clause else-clause)
     (cond (predicate then-clause)
                (else else-clause)))

差异与“if语句”:if语句评价一个个从谓语 - >结果 - >选择,

然而,“新假设”必须评估又名参数所有参数的那一刻它称为(这意味着“else从句”在开始!!评估)

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



文章来源: What's the explanation for Exercise 1.6 in SICP?