为什么在下一个代码中,当我们处理正常评估(懒惰)时,不会显示任何内容。
;;; [Number, Number -> Number]
(define (printing-sub x y)
(display x)
(- x y))
;;; [Number, Number -> Number]
(define (f a b)
(if (< a 0)
a
(f b (printing-sub b a))))
(f 0 0)
我会exmplain:在第一次迭代中,我们将获得(f 0 (printing-sub 0 0))
,在第二次:(f (prining-sub 0 0) (prining sub (printing sub 0 0) 0).
现在,在第3次,我们必须计算(printing-sub 0 0)
,因为我们想要知道(if (<a 0)
。在此迭代中,将打印出0。
我错过了什么?
谢谢。
答案 0 :(得分:0)
我也不知道“正常评估”是什么意思,但我不明白为什么你会期望用该代码打印出除0以外的任何内容。实际上它会导致无限循环,打印出无穷无尽的零。
请注意,(printing-sub 0 0)
将始终只显示0并返回0,因为(- 0 0)
为0.因此,在第一次迭代中,您得到(f 0 (printing-sub 0 0))
,这会缩减回(f 0 0)
导致无限循环。
换句话说,if
始终评估为#f
,因为a
永远不会变为0以外的其他任何内容。