エラトステネスの篩(Schemeで書きたかった)
なんとなく書いてみた。
(define (range m n) (cond ((> m n) ()) (else (cons m (range (+ m 1) n))))) (define (filter x l) (cond ((null? l) ()) ((= (modulo (car l) x) 0) (filter x (cdr l))) (else (cons (car l) (filter x (cdr l)))))) (define (sieve l) (cond ((null? l) ()) (else (cons (car l)(sieve (filter (car l) (cdr l)))))))
追記
以下のような指摘を受けたので、ちょっと修正してみた。
- iotaを使うようにした
- srfi-1のfilterと被らないように(?)ブロック構造にして中に書いた
(use srfi-1) (define (sieve-of-eratosthenes n) (define (filter x l) (cond ((null? l) ()) ((= (modulo (car l) x) 0) (filter x (cdr l))) (else (cons (car l) (filter x (cdr l)))))) (define (sieve l) (cond ((null? l) ()) (else (cons (car l)(sieve (filter (car l) (cdr l))))))) (sieve (iota (- n 1) 2)))