私はいくつかのHaskellを学び、プロジェクトオイラーの問題を進めてきました。私はオイラー問題(私は喜んでブルートフォースすることができます、または他の言語でそれを行うことができます)への答えについては本当に気になりませんが、方法です。
私は妥当な時間内に問題15を実行することに固執しています。20x20グリッドの左上から右下までの非バックトラックルートの数を要求します。ここにリンク
関数をメモ化(sp?)するというアイデアは当然だと思いますが、その方法がよくわかりません。私はグーグルで検索し、Haskell Cafeでこれに出くわしました。これは、素朴に適応しようとしましたが、最終的には次のようになりました。
memRoute :: (Int,Int) -> Int
memRoute (x,y) = fromJust $ lookup (x,y) $ map (\t -> (t,route t)) [(x,y) | x <- [0..20], y <- [0..20]]
route (0,0) = 0
route (_,0) = 1
route (0,_) = 1
route (x,y) = memRoute (x-1,y) + memRoute (x,y-1)
これは見栄えが悪く、パフォーマンスがひどいです(ナイーブバージョンよりもはるかに遅い)。問題は、Haskellのメモ化がどのように機能するのか本当に理解していないことです。
例として私のコードを使用して、誰かがa)私のものがとても遅い理由
b)それがどのように行われるべきか(私が出くわした解決策であった可変性を使用せずに)
c)この場合のメモ化がどのように機能するかを説明したいと思いますか?