2013-09-06

Project Euler - Problem 1

Categories: 数学 Lisp
euler_portrait.png

[ 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

再帰の方がコード自体は短いですね。個人的にはループのほうが処理の意味が明確かなと思います。

数学ガールの秘密ノート/整数で遊ぼう
結城 浩
SBクリエイティブ
売り上げランキング: 2,868

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.