次の関数をメモ化しようとしています。
gridwalk x y
| x == 0 = 1
| y == 0 = 1
| otherwise = (gridwalk (x - 1) y) + (gridwalk x (y - 1))
これを見て、私は次の解決策を思いつきました:
gw :: (Int -> Int -> Int) -> Int -> Int -> Int
gw f x y
| x == 0 = 1
| y == 0 = 1
| otherwise = (f (x - 1) y) + (f x (y - 1))
gwlist :: [Int]
gwlist = map (\i -> gw fastgw (i `mod` 20) (i `div` 20)) [0..]
fastgw :: Int -> Int -> Int
fastgw x y = gwlist !! (x + y * 20)
私はそれからこのように呼ぶことができます:
gw fastgw 20 20
Haskellで複数のパラメーターを持つ関数をメモ化するためのより簡単で簡潔で一般的な方法(gwlist
メモ化リストにアクセスできるように2Dから1D空間に変換するために関数の最大グリッド次元をハードコーディングする必要があることに注意してください)はありますか?