好这是一个家庭作业问题,但是我没有要求解决方法问题
我想问的是它要求我做什么?
范围
m:n
(m
≥n
)范围内整数的平方和 递归计算。如果范围内有多个数字m:n
,解决方案是将m
的平方加到正方形的总和上 在m+1:n
范围内;否则该范围内只有一个数字m:n
,m == 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函数?
答案 0 :(得分:1)
根据我的理解,你想要两个数字,例如1
和10
,对它们之间的每个数字(包含)进行平方,然后取总和。所以你想要一些像
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 1
,func 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))
您只需枚举从n
到m
的数字,对每个数字进行平方,然后取结果的总和。尝试用直接递归来解决这个问题只会让事情变得不必要地复杂化。
练习:编写您自己的本答案中使用的库函数版本。
-- | 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