;;;お題
;;;1からN未満の自然数で3または5の倍数の合計を求めよ
;;;ただし、9で割り切れる数は除外すること
;;;(foo n 結果表示関数) -> 合計 倍数のリスト
(define foo
(lambda (n col)
(cond
((zero? n) (col 0 '()))
((and (or (zero? (mod n 5))
(zero? (mod n 3)))
(not (zero? (mod n 9))))
(foo
(1- n)
(lambda (x y)
(col (+ n x) (cons n y)))))
(else
(foo (1- n) (lambda (x y) (col x y)))))))
;;;実行例
;;;N=30なら合計は171,倍数リストは以下のごとし
(foo 30 list)
(171 (30 25 24 21 20 15 12 10 6 5 3))
;;;N=1000000なら合計は188889611109
;;;リストは長いので非表示指示
(foo 1000000 (lambda (x y) x))
177778222224
;;;N=300000
(foo 300000 (lambda (x y) x))
16000100001