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 ()