Я сделал это следующим образом, который занимает менее 1 секунды на моем компьютере (ваша версия заняла около 12,5 секунд):
#lang racket
(define (divides? n div)
(= (remainder n div) 0))
(define (prime? n)
(prime-helper n 2))
(define (prime-helper n start)
(cond ((> start (sqrt n)) #t)
((divides? n start) #f)
(else (prime-helper n (+ 1 start)))))
(define (prob7_helper n count)
(cond ((= 10001 count) (- n 1))
((prime? n) (prob7_helper (+ 1 n) (+ 1 count)))
(else (prob7_helper (+ 1 n) count))))
(define (prob7) (prob7_helper 2 0))
(prob7)
Конечно, есть более быстрые реализации (prime? n)
, но это делаеттрюк для меня.