整数平方和
这个问题在这里已经有了答案:
根据我的理解,你想在它们之间取两个数字,例如1
和10
,每个数字(包含),然后取这两个数字的总和。 所以你会想要一些功能
sumOfSquaresBetween :: Int -> Int -> Int
sumOfSquaresBetween m n = ???
现在,你必须使用递归,所以这意味着???
将会是一些使用sumOfSquaresBetween
表达式。
现在有个技巧:如果你知道sumOfSquares nn
,那么你将如何找到sumOfSquares (n - 1) n
? 那么sumOfSquares (n - 2) n
呢? 你可以将这一般推广到sumOfSquares mn
for m <= n
吗? 如果是这样,那么你只是执行了你想要的算法,但是相反。
希望这个提示有帮助。
“范围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是真的。 ...)。
真的,解决这个问题的最好方法也是最简单的:使用库函数。
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
链接地址: http://www.djcxy.com/p/80703.html