#lang racket
(let ((r (lambda (cont)
(if (zero? (random 2))
(+ 1000 6)
(cont 6)))))
(+ (* (+ (call/cc r) 3) 8)
(* (+ (call/cc r) 3) 8)))
我在 Racket IDE 中运行了上面的代码,它给出了 3 个不同的结果 144、16144、8144。 我可以理解为什么代码输出144和16144,但我很困惑为什么它输出8144
我在windows 10下使用DrRacket,版本8.11.1
如果
(random 2)
返回 0,则 r
返回 1006,然后将 3 添加到其中并乘以 8,得到 8072。如果它返回 1,则 r
返回 6,然后将 3 添加到其中,乘以 8,得到 72。由于 r
被调用两次,每次返回 3 或 1006,因此将两个值相加会得到许多可能的结果:
第一个 | 第二个 | 结果 |
---|---|---|
6 | 6 | 144 |
6 | 1006 | 8144 |
1006 | 6 | 8144 |
1006 | 1006 | 16144 |