ななつめ

Clojureで条件式を書く(if、cond)

Clojureで書いたコード、第2弾。

今度は条件式。

お題・FizzBuzz

3で割り切れる数なら、Fizz。
5で割り切れる数なら、Buzz。
3でも5でも割り切れる数なら、FizzBuzz。
それ以外は、その数字をそのまま出力する関数を作成する。

そして、その関数に 1〜30 までの数を与えて、その出力を見る。

FizzBuzz

;; if式を使った場合
(defn fizzbuzz [num]
  (if (and (= (mod num 3) 0)
           (= (mod num 5) 0))
      "FizzBuzz"
      (if (= (mod num 3) 0)
        "Fizz"
        (if (= (mod num 5) 0)
          "Buzz"
           num))))

;; cond式を使った場合
(defn fizzbuzz [num]
  (cond (and (= (mod num 3) 0)
             (= (mod num 5) 0)) "FizzBizz"
        (= (mod num 3) 0) "Fizz"
        (= (mod num 5) 0) "Buzz"
        :else num))

この関数を使ってみる。

;; 自然数を定義
(defn whole-numbers [] (iterate inc 1))

;; 最初の30
user=> (take 30 (whole-numbers))
(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30)


;; 自然数の最初の30を表すリストの各要素に対し、
;; map関数で fizzbuzz 関数を適用し、
;; その結果できたリストに *fb* と名付けた。
(def *fb* (map fizzbuzz (take 30 (whole-numbers))))
;; リスト *fb* の各要素に対し、println を適用。
user=> (filter println *fb*)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
()