DrRacket 的来电/抄送

问题描述 投票:0回答:1
#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。 我可以理解为什么代码输出14416144,但我很困惑为什么它输出8144

我在windows 10下使用DrRacket,版本8.11.1

scheme racket continuations
1个回答
0
投票

如果

(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
© www.soinside.com 2019 - 2024. All rights reserved.