方案 - 打印到屏幕 - 正常评估

时间:2011-04-25 09:19:26

标签: scheme

为什么在下一个代码中,当我们处理正常评估(懒惰)时,不会显示任何内容。

;;; [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。

我错过了什么?

谢谢。

1 个答案:

答案 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以外的其他任何内容。