我刚刚开始通过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
等),只是让我知道。]
现在,我知道会发生什么:它永远不会返回一个值,这意味着程序无限递归。 我无法解释为什么会这样。 无论微妙的差异之间存在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的应用性使用顺序,但条件表达式求值不象正常功能( SiC颗粒章节1.1.6 ):
(if <predicate> <consequent> <alternative>)
为了评估一个if语句,解释器通过评估开始<predicate>
的表达式的一部分。 如果<predicate>
计算结果为真值,解释器然后计算<consequent>
和返回它的值。 否则,它评估<alternative>
和返回它的值。
Ex1.6。 新-IF:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
差异与“if语句”:if语句评价一个个从谓语 - >结果 - >选择,
然而,“新假设”必须评估又名参数所有参数的那一刻它称为(这意味着“else从句”在开始!!评估)
因此这会导致无限循环时任何这些参数自称为迭代循环