我正在阅读有关懒惰评估的内容,并且难以理解他们给出的基本示例。
#lang racket
(define (bad-if x y z)
(if x y z))
(define (factorial-wrong x)
(bad-if (= x 0)
1
(* x (factorial-wrong (- x 1)))))
(factorial-wrong 4)
对于这个程序为何永不终止,我有些困惑。我知道以下代码可以正常工作:
(define (factorial x)
(if (= x 0)
1
(* x (factorial (- x 1)))))
(factorial 4)
所以我假设它与范围有关。我尝试了一步一步的调试,即使x映射为0,阶乘错误也会执行递归函数。
标准 if
(if test-expr then-expr else-expr)
只会评估要么 then-expr
或者 else-expr
根据test-expr
,因为这if
可以是一个特殊形式或句法扩展基于一种特殊形式,这意味着它不遵循正常的评估规则上。
bad-if
另一方面,这是标准程序。在那种情况下,Scheme首先评估两个表达式,因为它们是实际执行bad-if
之前过程的参数bad-if
。因此,即使对于x = 0,(* x (factorial -1))
也将进行(* x (factorial -2))
无穷循环计算,依次进行计算,依此类推,依此类推。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句