以下程序找到给定数字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
写入输出。
答案 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