(define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (+ test-divisor 1))))) (define (divides? a b) (= (remainder b a) 0))
(smallest-divisor 199) ;answer is 199
(smallest-divisor 1999) ;answer is 1999
(smallest-divisor 19999) ;answer is 7
;生成奇数 (define (odd-generator x) (if (odd? x) (+ x 2) (+ x 1)))
1 2 3 4 5 6 7 8
;大于x的前i个素数 (define (continue-prime i x) (cond ((= i 0) (display "These are all primes")) ((prime? x) (display x) (newline) (continue-prime (- i 1) (odd-generator x))) (else (continue-prime i (odd-generator x)))))
1 2 3 4 5 6 7 8 9 10 11
;判断素数,可以采用33页最基本的方法 (define (prime? n) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (+ test-divisor 1))))) (define (divides? a b) (= (remainder b a) 0)) (= n (smallest-divisor n)))
(define (new-prime? n) (define (next x) (if (= x 2) 3 (+ x 2))) (define (smallest-divisor n) (find-divisor n 2)) (define (find-divisor n test-divisor) (cond ((> (square test-divisor) n) n) ((divides? test-divisor n) test-divisor) (else (find-divisor n (next test-divisor))))) (define (divides? a b) (= (remainder b a) 0)) (= n (smallest-divisor n)))
然后用这个新的素数判断过程重写continue-prime
1 2 3 4 5 6 7
(define (continue-newprime i x) (cond ((= i 0) (display "These are all primes")) ((new-prime? x) (display x) (newline) (continue-prime (- i 1) (odd-generator x))) (else (continue-prime i (odd-generator x)))))