人気ブログランキング | 話題のタグを見る

おさらい

Real World Haskell の読書ばかりしていたら、自分で全くプログラムを書かなくなった。それで、今日は ghci 上でおさらいをしてみた。

まず、階乗の計算。

Prelude> let fact 0 = 1; fact n = n * fact (n-1)
Prelude> fact 5
120

次はフィボナッチ数列

Prelude> let fib = 0 : 1 : zipWith (+) fib (tail fib)
Prelude> take 10 fib
[0,1,1,2,3,5,8,13,21,34]

クイックソート

Prelude> let qsort [] = []; qsort (x:xs) = qsort (filter (<= x) xs) ++ [x] ++ qsort (filter (>x) xs)
Prelude> qsort [20,12,5,31]
[5,12,20,31]

サイコロを2つ振った時の目の出方

Prelude> [(x,y)| x <- [1..6], y <- [1..6]]
[(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(6,1),(6,2),(6,3),(6,4),(6,5),(6,6)]

その和

Prelude> [x+y| x <- [1..6], y <- [1..6]]
[2,3,4,5,6,7,3,4,5,6,7,8,4,5,6,7,8,9,5,6,7,8,9,10,6,7,8,9,10,11,7,8,9,10,11,12]

ここで Data.List モジュールをロード

Prelude> :m + Data.List

上の和の並べ替え

Prelude Data.List> sort [x+y| x <- [1..6], y <- [1..6]]
[2,3,3,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,10,10,10,11,11,12]

おなじスコアはまとめる。

Prelude Data.List> group $ sort [x+y| x <- [1..6], y <- [1..6]]
[[2],[3,3],[4,4,4],[5,5,5,5],[6,6,6,6,6],[7,7,7,7,7,7],[8,8,8,8,8],[9,9,9,9],[10,10,10],[11,11],[12]]

スコアと出現頻度のペアを作る。

Prelude Data.List> map (\x -> (head x, length x)) $ group $ sort [x+y| x <- [1..6], y <- [1..6]]
[(2,1),(3,2),(4,3),(5,4),(6,5),(7,6),(8,5),(9,4),(10,3),(11,2),(12,1)]

7の目が一番出やすいのが分かった。

ペアを作って、とかスコアを並び替えてなど、抽象的な考えのままプログラムできてしまうので、プログラムを作っているのだという実感が涌かない。楽だからいいのだけれど。
by tnomura9 | 2012-05-31 16:49 | Haskell | Comments(0)
<< おさらい その2 DANCEROID 名作選 >>