2007-03-04
■ [SICP]パスカルの三角形

以前、いろんな方が実装していたパスカルの三角形の問題をときました。
表示は手抜き。
$ 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]]
コメントを書く