在Scheme中,我将基本的“if”命令修改为:
(define (modified-if predicate then-clause else-clause)
(if predicate
then-clause
else-clause))
然后我使用 if 的修改版本定义了一个简单的阶乘生成程序:
(define (factorial n)
(modified-if (= n 0)
(* n (factorial (- n 1)))))
现在,当我调用上面的函数时,它进入无限循环。为什么会发生这种情况?
方案得到热切评价。这意味着,除非您使用特殊形式(例如if
)或宏(例如cond
or case
)委托给这样一个特殊的形式,all首先评估子表达式。
这意味着你的表达
(modified-if (= n 0)
1
(* n (factorial (- n 1))))
the (* n (factorial (- n 1)))
首先评估,之前modified-if
正在运行。 (它可以在之前或之后运行(= n 0)
,但无论哪种方式都没关系,无论如何,递归调用仍然会发生。)并且由于这是一个递归调用,这意味着您的程序将无限递归,并且您最终将耗尽堆栈。
这是一个简单的例子:考虑一下:
(if #t
(display "Yay!")
(error "Oh noes!"))
Because if
是一种特殊形式,它只评估必要的分支,在这种情况下它只会评估(display "Yay!")
并且不评价(error "Oh noes!")
。但如果你改用你的modified-if
,两个表达式都将被计算,并且您的程序将引发错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)