Problem 1

面白そうなので解いてみる。

Problem 1 - PukiWiki

10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、これらの合計は 23 になる。

同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。

FizzBuzzみたいな感じ。

(define (problem1 n)
  (cond ((zero? n) 0)
        ((or (zero? (modulo n 3))
             (zero? (modulo n 5)))
         (+ n (problem1 (- n 1))))
        (else
          (problem1 (- n 1)))))

(problem1 9) ; 23
(problem1 999) ; 233168

未満の意図がイマイチよくわかんね。


ついでに反復。

(define (problem1 n)
  (define (iter acc n)
    (cond ((zero? n) acc)
        ((or (zero? (modulo n 3))
             (zero? (modulo n 5)))
         (iter (+ acc n) (- n 1)))
        (else
          (iter acc (- n 1)))))
  (iter 0 (- n 1)))

(problem1 10) ; 23
(problem1 1000) ; 233168

誤魔化し気味で。


iotaで。

(define (problem1 n)
  (fold (lambda (n acc)
          (if (or (zero? (modulo n 3))
                  (zero? (modulo n 5))) (+ acc n)
              acc))
        0
        (iota n)))

(problem1 10) ; 23
(problem1 1000) ; 233168

こうかな。