1

私はそれを「私のやり方」で行うのを手伝いたいのですが、それを行うためのより良い/より多くのハスケリックな方法を知りたい場合は他のソリューションをグーグルで検索できます

今私は得る:

Couldn't match expected type `Int' with actual type `[Int]

これが私の考えですが、どこか間違っています。アキュムレータを送信するときはどうすればよいですか(「ベースケース」であるかどうかを前後に考えました)

私の考えでは、コインの1つを選択し、他のすべてのコインを別々の再帰で追加して、それが200に等しいかどうかを確認します。そうであれば、それが私の結果に追加したいものです。それより低い場合は、コインをたとえば、リスト[100,50]してから同じ方法で再帰します。200を超える場合は、null/emptyなどを返します。Handこれまでに追加されたコインと呼んでいます

module Main where

coins = [100,50,20,10,5,2,1]

euler31 :: Int
euler31 = 1 + length (twoPoundCombinations)

twoPoundCombinations = recursion [] [[]]

recursion :: [Int] -> [[Int]] -> [[Int]],
recursion hand result
    | sum hand == 200 = [hand]
    | sum hand  > 200 = [[]]
    | sum hand  < 200 = result ++ map (\x -> recursion (x:hand) [[]]) coins
4

1 に答える 1

2
map (\x -> recursion (x:hand) [[]]) coins

タイプがあり[[[Int]]]ます。[]それは多すぎる1つの層です。

result ++ concat (map (\x -> recursion (x:hand) [[]]) coins)

正しいタイプになります。

(しかし、あなたのアプローチには時間がかかり、正しい結果が得られません。)

于 2012-07-15T20:59:06.537 に答える