Last active
August 29, 2015 13:58
-
-
Save kohyama/10346936 to your computer and use it in GitHub Desktop.
FibBuzz in Clojure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defn fibs [a b] (cons a (lazy-seq (fibs b (+' a b))))) | |
(defn fizzbuzz [x] | |
(condp #(zero? (mod %2 %1)) x | |
15 "FizzBuzz" | |
5 "Buzz" | |
3 "Fizz" | |
x)) | |
(def fibbuzz-seq (map fizzbuzz (fibs 1 1))) | |
; (take 100 fibbuzz-seq) | |
; -> (1 1 2 "Fizz" "Buzz" 8 13 "Fizz" ... 218922995834555169026N "FizzBuzz") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
FibBuzz in Clojure
Google で "FibBuzz" を検索
フィボナッチ数列
fibs
は,a b
をとり,b
と二つの引数の和(+' a b)
を引数として, 自分自身を呼び出した結果(fibs ...)
(lazy-seq ...)
(cons a ...)
を返す関数です.
従って, 最初の 2 項を引数として
fibs
を呼び出すと, フィボナッチ数列を遅延シーケンスによって実現された無限数列として返します.最初の 20 項は以下のようになります.
+
でなく+'
を使っているのは, 値が大きくなったときに自動で多倍長整数に拡張するためです.100 項まで取得します.
+'
を使っているため, 整数のデフォルト型である long がオーバーフローする際は, 多倍長整数 BigInteger に自動で型変換されます.N
が末尾についている整数は, 多倍長整数のリテラル表現です.FizzBuzz
fizzbuzz
は, 引数x
が"FizzBuzz"
を,"Buzz"
を,"Fizz"
を,x
を返します.
condp
は,(condp p x t0 r0 t1 r1 ... rn)
のような形式で使い,
p
に真偽値 (として解釈できる値) を返す二引数関数を与えると(p t0 x)
が真ならばr0
を(p t1 x)
が真ならばr1
をrn
を返します.
つまり
は,
(zero? (mod x 15))
が真ならば"FizzBuzz"
を,(zero? (mod x 5))
が真ならば"Buzz"
を,(zero? (mod x 3))
が真ならば"Fizz"
を,x
を返します.
と同等です.
FibBuzz 列
fibbuzz-seq
は,fibs
に最初の二項1 1
を与えて作ったフィボナッチ数列(fibs 1 1)
fizzbuzz
を適用(map fizzbuzz ...)
したシーケンスです.
無限シーケンスですので, 有限項を取り出して利用します.
Clojure 演習