(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

エラトステネスの篩(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)))