2013-09-06
Project Euler - Problem 1
[ PR ]
Common Lispの練習として、今更ながらProject Eulerを解いていこうと思います。
Problem 1「3と5の倍数」
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
今回は再帰とループの2種類で解いてみました。
(defun prob1_1 (&optional (x 1) (r 0))
(let ((res
(if (or (zerop (rem x 3)) (zerop (rem x 5)))
(+ x r) r)))
(if (> x 999) r (prob1_1 (1+ x) res))))
(defun prob1_2 ()
(let ((res 0))
(dotimes (x 999 res)
(let ((n (1+ x)))
(if (or (zerop (rem n 3)) (zerop (rem n 5)))
(setq res (+ res n)))))))
(print (prob1_1)) ; 233168
(print (prob1_2)) ; 233168
再帰の方がコード自体は短いですね。個人的にはループのほうが処理の意味が明確かなと思います。