2008年04月20日

[Haskell] maximumを使わずに最大値を求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
標準関数 max, maximum を使わずに、最大値を求める関数を書け。

最初に書いたコードはこれ。

maxnum :: [Integer] -> Integer
maxnum [a] = a
maxnum (x:xs)
| x > maxnum xs = x
| otherwise = maxnum xs

ガードを使って書いてみた。
2回同じ maxnum xs が出てどうなんだろう?って思ったが、動くことには動いた。でも、ものすごく遅い。

次に書いたのがこちら。

maxnum :: [Integer] -> Integer
maxnum (x:xs) = maxnum_ x xs
 
maxnum_ :: Integer -> [Integer] -> Integer
maxnum_ n [] = n
maxnum_ n (x:xs) = maxnum_ (maxn n x) xs
 
maxn :: Integer -> Integer -> Integer
maxn a b = if a > b then a else b

これならば、速度的には問題ないようだ。
でも、意外と手こずった。

先頭の要素を2つ取り出すのに、2段階に関数を定義しなければならないのが厄介だが、これしかやり方が思いつかない。
foldl系の関数を使えばもっと簡単になるが、foldl系の関数も中身は同じようなことをやっているので、本質的には変わらない。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51484926