Problem 1
面白そうなので解いてみる。
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
こうかな。