平方整数和haskell

平方整数和haskell,haskell,integer,Haskell,Integer,我有这段代码来计算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 为此,我将如何重新定义函数sumsqu

我有这段代码来计算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:middle)的平方和与平方和(middle+1:n)相加,
否则,在m:n范围内只有一个数字,因此m==n,解就是m的平方。(请注意,使用这种方法,递归结合了两个半解:每个子问题的大小约为整个问题的一半)。

在原始函数中,类型签名中的类约束
积分a
已过时(
a
在签名中的任何其他地方都没有提及,是吗?)。此外,函数的第三个参数(
middle
)仍然未使用。因此,你可以把它写成

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = m * m + sumsquares (m + 1) n
重写它以从一个方案转移到一个严格的分治方案,然后只需要相应地调整递归情况:

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = let middle = (m + n) `div` 2
                in  sumsquares m middle + sumsquares (middle + 1) n

当然,问题仍然是,你为什么要做出这样的改变。一个原因可能是您正在准备算法以适应并行化:事实上,分而治之通常比分而治之更合适。

在原始函数中,类型签名中的类约束
积分a
已过时(
a
在签名的其他地方没有提到,是吗?)。此外,函数的第三个参数(
middle
)仍然未使用。因此,您可以将其编写为

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = m * m + sumsquares (m + 1) n
重写它以从一个方案转移到一个严格的分治方案,然后只需要相应地调整递归情况:

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = let middle = (m + n) `div` 2
                in  sumsquares m middle + sumsquares (middle + 1) n

当然,问题仍然是您为什么要进行此更改。一个原因可能是您正在准备算法以适应并行化:那么,实际上,分而治之通常比分而治之更合适。

在原始函数中,signatu类型中的类约束
Integral a
re已经过时了(
a
在签名的其他地方没有提到,是吗?)。此外,函数的第三个参数(
middle
)仍然未使用。因此,您可以将其编写为

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = m * m + sumsquares (m + 1) n
重写它以从一个方案转移到一个严格的分治方案,然后只需要相应地调整递归情况:

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = let middle = (m + n) `div` 2
                in  sumsquares m middle + sumsquares (middle + 1) n

当然,问题仍然是您为什么要进行此更改。一个原因可能是您正在准备算法以适应并行化:那么,实际上,分而治之通常比分而治之更合适。

在原始函数中,signatu类型中的类约束
Integral a
re已经过时了(
a
在签名的其他地方没有提到,是吗?)。此外,函数的第三个参数(
middle
)仍然未使用。因此,您可以将其编写为

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = m * m + sumsquares (m + 1) n
重写它以从一个方案转移到一个严格的分治方案,然后只需要相应地调整递归情况:

sumsquares :: Int -> Int -> Int 
sumsquares m n  
  | m > n     = error "First number cannot be bigger than second number"
  | m == n    = m * m
  | otherwise = let middle = (m + n) `div` 2
                in  sumsquares m middle + sumsquares (middle + 1) n


当然,问题仍然是,你为什么要做出这种改变。一个原因可能是你正在准备你的算法以适应并行化:那么,事实上,分而治之通常比分而治之更合适。

我不明白你需要什么……你没有使用它,从你的描述来看n关于我认为您想要如何使用它,它不会保存任何内容。可能的重复我想它不是重复的,因为问题是要求一个不同的解决方案结构。我不明白您需要什么…您没有使用它,并且从您对我认为您想要如何使用它的描述来看,它不会保存任何内容。可能的重复当然,我想这不是重复,因为问题要求的是一个不同的解决方案结构。我不明白你需要中间层做什么……你没有使用它,而且从你对我认为你想如何使用它的描述来看,它没有保存任何东西。可能的重复我想这不是重复,因为问题要求的是不同的解决方案n结构。我不明白你需要中间层做什么……你没有使用它,从你对我认为你想如何使用它的描述来看,它没有保存任何东西。可能的重复我想它不是重复的,因为问题是要求不同的解决方案结构。啊,我明白你的意思,我如何使用跟踪来显示它的com计算?@Harry Lists,然而,并行性很差,所以只有在每次计算都很昂贵的情况下,你才能从中获得一些东西。这里不是这样,所以对列表元素的平方进行求和的最快方法就是按顺序一个接一个地进行计算。@dfeuer如果有许多便宜的计算发生,你也可以获得一些东西。请注意我并不是说每个乘法都在它自己的线程中执行。如果你有足够的乘法分配给一个线程,那么并行化的收益可能仍然超过了产生的开销。@StefanHoldermans,我认为这对于
数组
向量
ByteString
,中的许多廉价计算都是适用的,
Text
Sequence
,等等,但是对列表中元素的平方求和,跟随所有指针遍历列表的任务是相当大的一部分工作,使用多个线程也不会有任何帮助。@dfeur是的,但是在这个例子中,没有列表。啊,我明白你的意思了,我如何使用跟踪来遍历列表如何计算?@Harry Lists的并行性很差,因此只有在每次计算都很昂贵的情况下,你才能从中获得一些好处。这里不是这样,所以对列表中元素的平方进行求和的最快方法就是按顺序一个接一个地进行计算。@dfeuer如果有许多便宜的计算发生,你也可以从中获益。请注意,我没有被建议