takkan_mのHaskell再挑戦 RSSフィード

2007-03-04

[]パスカル三角形 20:50 パスカルの三角形 - takkan_mのHaskell再挑戦 を含むブックマーク はてなブックマーク - パスカルの三角形 - takkan_mのHaskell再挑戦 パスカルの三角形 - takkan_mのHaskell再挑戦 のブックマークコメント

以前、いろんな方が実装していたパスカル三角形の問題をときました。

表示は手抜き。

$ cat pTriangele.hs 
pTriangle :: Int -> [[Int]]
pTriangle n = cPascal [[]] n 0 1 []
    where
        cPascal :: [[Int]] -> Int -> Int -> Int -> [Int] -> [[Int]]
        cPascal xs n i l ys 
            | n == 0      = tail xs
            | l == i      = cPascal ( xs ++ [ ys ] ) ( n - 1 ) 0 ( l + 1 ) []
            | otherwise   = cPascal xs n ( i + 1 ) l $ makeArray xs i ys
        makeArray :: [[Int]] -> Int -> [Int] -> [Int]
        makeArray xs i ys = flip (:) ys $ getElem xs i
        getElem   :: [[Int]] -> Int -> Int
        getElem   xs i    = addElem ( getPElem xs ( i - 1 ))  ( getPElem xs i)
        addElem   :: Int -> Int -> Int
        addElem   0 0     = 1
        addElem   x y     = x + y
        getPElem  :: [[Int]] -> Int -> Int
        getPElem  _  (-1) =  0
        getPElem  xs i    = selectElemInteger $ drop i $ getPArray xs
                where 
                        selectElemInteger ::  [Int] -> Int
                        selectElemInteger [] = 0
                        selectElemInteger xs = head xs
        getPArray :: [[Int]] -> [Int]
        getPArray = head . reverse

それにしても、引数が多すぎて汚いなぁ。

パターンマッチで一度引数書いたら、その関数の別の定義はポイントフリーで書けないのね。初めて知りました。

こんな感じでは、書けないんですね。

hoge :: [a] -> a
hoge [] = 0
hoge = head

実行結果はこちら

$ ghci pTriangele.hs 
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.6, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( pTriangele.hs, interpreted )
Ok, modules loaded: Main.
*Main> pTriangle 3
[[1],[1,1],[1,2,1]]
*Main> pTriangle 4
[[1],[1,1],[1,2,1],[1,3,3,1]]
*Main> pTriangle 7
[[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]]

VerucaVeruca 2016/05/10 22:21 Hey There. I found your blog using msn. This is a really well written article. I&8;217#ll make sure to bookmark it and come back to read more of What Sticks: The History of Adhesive Tape | . Thanks for the post. I’ll certainly return.

ゲスト



トラックバック - http://haskell.g.hatena.ne.jp/takkan_m/20070304