パスカルの三角形(Haskell)
その1。
main :: IO () main = print $ map pascal [0..8] pascal :: Int -> [Int] pascal 0 = [1] pascal n = [1] ++ eachCons (pascal (n - 1)) ++ [1] eachCons :: [Int] -> [Int] eachCons xs = if length xs < 2 then [] else (head xs + (head . tail) xs): (eachCons . tail) xs
結果。
[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1],[1,6,15,20,15,6,1],[1,7,21,35,35,21,7,1],[1,8,28,56,70,56,28,8,1]]
その2。
main :: IO () main = putStr $ unlines $ map (centering 30 . toString) (map pascal [0..8]) centering :: Int -> String -> String centering n str = (replicate i ' ') ++ str ++ (replicate j ' ') where l = length str i = div (n - l) 2 j = n - l - i toString :: [Int] -> String toString xs = tail $ concat $ map f xs where f x = ' ': show x pascal :: Int -> [Int] pascal 0 = [1] pascal n = [1] ++ eachCons (pascal (n - 1)) ++ [1] eachCons :: [Int] -> [Int] eachCons xs = if length xs < 2 then [] else (head xs + (head . tail) xs): (eachCons . tail) xs
結果。
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1
unlines 関数:[String]を改行を入れて結合する。[String] -> String。
concat 関数:リストの平坦化。
div 関数:整数/整数をして整数で返す。