【发布时间】:2011-02-08 03:33:56
【问题描述】:
给定这个定义和一个测试矩阵:
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| |
我正在尝试编写一个函数来输出列总和列表,例如:[13, 11, 18, 18]。基本思想是对每个子四叉树求和:
- 如果四叉树是
(C c),则输出一个重复的2 ^ (n - 1)乘以值c * 2 ^ (n - 1)。 例子:第一个四叉树是(C 5),所以我们重复5 * 2^(2 - 1) = 10,2 ^ (n - 1) = 2次,得到[5, 5]。 - 否则,给定
(Q a b c d),我们zipWitha 和 c(以及 b 和 d)的 colsum。
当然这是不工作(甚至不能编译),因为经过一些递归我们有:
zipWith (+) [[10, 10], [12, 12]] [zipWith (+) [[1], [0]] [[2], [1]], [6, 6]]
因为我是从 Haskell 开始的,所以我觉得我缺少一些东西,需要一些关于我可以使用的功能的建议。 不工作 colsum 定义是:
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
任何想法都会很棒,非常感谢......
【问题讨论】:
-
为什么后两列的和是 21?他们不应该是 18 岁吗?
-
@drvitek:你说得对,谢谢。想法?
-
看来您在这里问了很多关于 SO 的问题,这些问题都是作业问题。也许问一个同学会是一个更好的解决方案,因为他们会遇到同样的问题?
标签: algorithm haskell matrix quadtree