检查指定范围内连续奇数的素数

时间:2015-11-30 20:18:34

标签: algorithm scheme

以下程序找到给定数字1的最小整数除数(大于n)。它通过以n开头的连续整数测试2的可除性来直接执行此操作。

当且仅当n是其自己的最小除数时,

n才是素数。

(define (square x) (* x x))

(define (divisible? a b)
  (= (remainder a b) 0))

(define (find-divisor n test)
  (cond ((> (square test) n) n)
        ((divisible? n test) test)
        (else (find-divisor n (+ test 1)))))

(define (smallest-divisor n)
  (find-divisor n 2))

(define (prime? n)
  (= (smallest-divisor n) n))

如何编写一个检查指定范围内连续奇数的素数的过程?

(define (search_for_primes from to)
   (cond ((> from to) false)
         ((prime? from) (display from))
         (else (search_for_primes (+ 1 from) to))))

我的解决方案只是将1写入输出。

2 个答案:

答案 0 :(得分:1)

你应该开始在这个范围内做一个有效的筛子(如Eratosthenes的筛子),以有效地捕获多个小素数。如果您的数字很小,那么只需要sqrt(n)即可。 (这对于例如Project Euler问题来说已经足够了。)

如果您的范围很小且数字很大,请使用它来获得“可能的素数”,然后使用您最喜欢的素性测试(请参阅https://en.wikipedia.org/wiki/Primality_test获取某些选项)。

如果您的范围很大且数量很大......那么您就会遇到问题。 : - )

答案 1 :(得分:1)

cond将停在第一个匹配并仅执行相应的表达式。因此,如果您执行(search_for_primes 1 xxx),则1 错误地 被识别为素数,并且程序将停在那里。

你想要的是

(define (search_for_primes from to)
  (unless (> from to)
    (when (prime? from)
      (display from)
      (display " "))
    (search_for_primes (+ 1 from) to)))

无论你是否找到素数,都会进行递归。

测试:

> (search_for_primes 2 100)
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97