トップページ > プログラム > 2014年05月18日 > oFqJpTun

書き込み順位&時間帯一覧

57 位/267 ID中時間01234567891011121314151617181920212223Total
書き込み数0100000000010000000000002



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
関数型プログラミング言語Haskell Part25

書き込みレス一覧

関数型プログラミング言語Haskell Part25
709 :デフォルトの名無しさん[]:2014/05/18(日) 01:28:02.75 ID:oFqJpTun
ある本にあった、"数字の列kからn個取り出してその和がmかどうか調べる"という問題を
下記のように作ったんだけど、組み合わせのリストを作るのに苦労した。
もっとうまいやり方ありません?

checkComb:: Int -> Int -> [Int] -> String
checkComb _ _ [] = "No"
checkComb 0 _ _ = "No"
checkComb n m k = if elem m sumList then "Yes" else "No"
where cb = makeCombList n [([], k)]
sumList = [foldl (+) 0 (fst l) | l<-cb]

makeCombList :: Int -> [([Int],[Int])] -> [([Int],[Int])]
makeCombList n input
| n == 0 = input
| otherwise = makeCombList (n-1) (foldr (++) [] (map f input))
where f it = [(x:(fst it), List.delete x (snd it)) | x<-(snd it)]
関数型プログラミング言語Haskell Part25
711 :デフォルトの名無しさん[]:2014/05/18(日) 11:58:12.01 ID:oFqJpTun
>>710 ありがと

後でもっと自然に再帰的に書けると思って変更してみた。
checkComb:: Int -> Int -> [Int] -> String
checkComb _ _ [] = "No"
checkComb 0 _ _ = "No"
checkComb n m k = if elem m sumList then "Yes" else "No"
where cb = makeCombList n k
sumList = [foldl (+) 0 l | l<-cb]

makeCombList :: Int -> [Int] -> [[Int]]
makeCombList 0 input = [[]]
makeCombList 1 input = [[a] | a<-input]
makeCombList n input = concat $ map f input
where f a = map (a:) $ makeCombList (n-1) (Data.List.delete a input)

けど、710の方が簡潔ですね。
べき集合のリストを作る→必要な分だけ取り出す みたいな感じにする方が、
遅延評価があるhaskellらしいプログラムになるのか。(計算量は同じ?)


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。