整数的平方和

时间:2014-12-12 03:48:15

标签: haskell recursion

好这是一个家庭作业问题,但是我没有要求解决方法问题

我想问的是它要求我做什么?

  

范围m:nmn)范围内整数的平方和   递归计算。如果范围内有多个数字   m:n,解决方案是将m的平方加到正方形的总和上   在m+1:n范围内;否则该范围内只有一个数字   m:nm == n,解决方案只是m的正方形。

     

一个。定义递归函数sumsquares来执行此操作   计算。一如既往,绘制一系列测试数据显示   预期输出,然后测试功能。

我知道我必须编写一个名为sumsquares的递归函数,但我不太清楚它是什么意思" m:n范围内整数的平方和(m 1}}≥n)可以递归计算"。

这是我到目前为止的代码,这是正确的吗?

sumsquares :: Integral a=> Int -> Int -> Int
sumsquares m n
 |m > n = error "First number cannot be bigger than second number"
 |m==n = m*n
 |otherwise = m*n +sumsquares (m+1)n

其他人想出了这个答案

sumOfSquaresFast :: Integral a => a -> a -> a
sumOfSquaresFast lo hi
    | lo > hi   = error "sumOfSquaresFast: lo > hi"
    | otherwise = ssq hi - ssq (lo - 1)
    where ssq x = div (2 * x^3 + 3 * x^2 + x) 6

但我不明白底部,ssq和div函数?

3 个答案:

答案 0 :(得分:1)

根据我的理解,你想要两个数字,例如110,对它们之间的每个数字(包含)进行平方,然后取总和。所以你想要一些像

这样的功能
sumOfSquaresBetween :: Int -> Int -> Int
sumOfSquaresBetween m n = ???

现在,你必须使用递归,这意味着???将是一个使用sumOfSquaresBetween的表达式。

现在就是诀窍:如果您知道sumOfSquares n n,那么您如何找到sumOfSquares (n - 1) n?那么sumOfSquares (n - 2) n呢?您能否一并概括为sumOfSquares m n的{​​{1}}?如果是这样,那么你刚刚执行了所需的算法,但反之亦然。

希望这个暗示有所帮助。

答案 1 :(得分:0)

“m:n(其中m≥n)范围内的整数平方和可以递归计算。”

让我们分开......


“m:n”范围内的整数

是从m开始到n

的整数集

[m,m + 1,m + 2,...... n]

即 -

integers in the range 4:8 = [4,5,6,7,8]

“......的方块”

您可能知道,x的数字的平方为x*x,所以

squares of integers in the range 4:8 = [16, 26, 36, 49, 64]

“总和......”

添加

The sum of the squares of integers in the range 4:8 = 16+26+36+49+64

“....可以递归计算机”

嗯,你必须理解递归才能得到这个......

定义中包含自身的任何函数都是递归的。当然你要小心,如果做得不正确,递归函数可能导致无限循环......

对于Ints,(N-1)递归是常见的....如果您可以使用(N-1)的计算来评估N的计算,计算机可以减少数字,直到达到已知值(通常为0)。通过示例可以更好地看到这一点。

let func n = sum of integers from 0 to n

(这就像你的问题,但没有方块部分)

如果您知道func (n-1)的值,则可以轻松计算func n

的值
func n = n + func (n-1)
func 0 = 0

计算机将使用func 0来计算func 1func 1来计算func 2等,一直到N.


递归有两种常见的(但实际上是非常不同的)用法......首先,如上所示,它允许非常干净的函数定义。

其次,它通常用于数学来证明所有整数的真实性(即 - 证明某些事物适用于所有整数,证明它对于0是正确的,然后证明对于N是否为真,对N来说是正确的1 ....)。

答案 2 :(得分:0)

真的,解决这个问题的最好方法也是最简单的方法:使用库函数。

sumsquares :: Integral a => a -> a -> a
sumsquares m n = sum (map (^2) (enumFromTo n m))

您只需枚举从nm的数字,对每个数字进行平方,然后取结果的总和。尝试用直接递归来解决这个问题只会让事情变得不必要地复杂化。

练习:编写您自己的本答案中使用的库函数版本。

-- | Generate the list of all values in the given range.  Result is inclusive.
enumFromTo :: Enum a => a -> a -> [a]

-- | Apply a function individually to each element of the argument list,
-- and collect the results as a list, respecting the order of the original.
map :: (a -> b) -> [a] -> [b]


-- | Calculate the sum of a list of numbers.
sum :: Num a => [a] -> a