第四章

生成素数

我们先举一个简单的例子示意一下我们上面的方便函数怎么用:

(define (prime? n)
  (call/cc
   (lambda (return)
     (do ((i 2 (+ i 1)))
         ((> i (sqrt n)) #t)
       (if (= (modulo n i) 0) 
           (return #f))))))

(define gen-prime
  (lambda (hi)
    (let ((i (number-between 2 hi)))
      (assert (prime? i))
      i)))

其实这里就只是定义了一个函数 prime?,它可以判断一个数是不是 素数。然后我们定义了一个函数 gen-prime,它说:“ *从 2 到 hi 取一个数,它必须是一个素数。* ”

我们用 (gen-prime 20) 就能返回 20 以内的第一个素数。如果我们 要得到下一个素数,就调用 (amb)。不断调用 (amb) 就得到后面的 素数,直到超过 20,我们就会看到 "amb tree exhausted".

如果用

(bag-of (gen-prime 20))

我们就能一次性得到所有 20 以内的素数在一个 list 里。