我有这个代码来计算m:n范围内的整数平方和
sumsquares :: Integral a=> Int -> Int -> Int -> Int
sumsquares m n middle
| m > n = error "First number cannot be bigger than second number"
|m==n = m*m
|otherwise = m*m + sumsquares (m+1)n
我将如何为此目的重新定义函数sumsquares?
如果m:n范围内有多个数字,则计算范围的中间值,并将(m:中间)的平方和加到平方和(中间1:n),否则只有一个在m:n范围内的数字,所以m = = n,解是正方形的m . (注意,通过这种方法,递归结合了两个半解:每个子问题大约是整个问题的一半) .
1 回答
在原始函数中,类型签名中的类约束
Integral a
已过时(签名中的其他位置都没有提到a
,是吗?) . 此外,函数的第三个参数(middle
)仍未使用 . 因此,你可以把它写成重写它以从decrease-and-conquer方案转变为严格的分而治之计划然后只需相应地调整递归情况:
当然,问题仍然是你想要做出这种改变的原因 . 一个原因可能是你正在准备你的算法以适应并行化:然后,实际上,分而治之通常比减少和征服更合适 .