この定義とテスト マトリックスを考えると、次のようになります。
data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a)
deriving (Eq, Show)
data (Eq a, Num a, Show a) => Mat a = Mat {nexp :: Int, mat :: QT a}
deriving (Eq, Show)
-- test matrix, exponent is 2, that is matrix is 4 x 4
test = Mat 2 (Q (C 5) (C 6) (Q (C 1) (C 0) (C 2) (C 1)) (C 3))
| | |
| 5 | 6 |
| | |
-------------
|1 | 0| |
|--|--| 3 |
|2 | 1| |
のように、列 sumのリストを出力する関数を作成しようとしています[13, 11, 18, 18]
。基本的な考え方は、各サブ四分木を合計することです。
- quadtree が
(C c)
の場合、値 の繰り返し2 ^ (n - 1)
回数を出力しますc * 2 ^ (n - 1)
。例: 最初の四分木は、[5, 5] を取得(C 5)
して を繰り返します。5 * 2^(2 - 1) = 10
2 ^ (n - 1) = 2
- そうでなければ、与えられた
(Q a b c d)
、zipWith
a と c (および b と d) の colsum です。
もちろん、これは機能していません(コンパイルすらしていません)。
zipWith (+) [[10, 10], [12, 12]] [zipWith (+) [[1], [0]] [[2], [1]], [6, 6]]
私は Haskell を使い始めているので、何かが足りないと感じています。使用できる機能についてアドバイスが必要です。コルサムの定義が機能しない:
colsum :: (Eq a, Show a, Num a) => Mat a -> [a]
colsum m = csum (mat m)
where
n = nexp m
csum (C c) = take (2 ^ n) $ repeat (c * 2 ^ n)
csum (Q a b c d) = zipWith (+) [colsum $ submat a, colsum $ submat b]
[colsum $ submat c, colsum $ submat d]
submat q = Mat (n - 1) q
どんなアイデアも素晴らしく、大歓迎です...