我目前正在尝试计算以下数额:
sum2015 :: Integer->Integer->Integer
sum2015 m n
| m>n = 0
| otherwise = (m+m)^n + sum2015 (m+1) n
例如,sum2015 0 1
应返回1
。但是,它返回2
。我做错了什么?
答案 0 :(得分:4)
你没有计算这笔钱。请注意,m
中的(m + i)^n
必须保持不变,但您在此处使用 new m
:
| otherwise = … + sum2015 (m+1) n
-- ^^^^^
-- oh oh
因此你得到:
sum2015 0 1
= (0 + 0)^1 + sum2015 (0 + 1) 1
= (0 + 0)^1 + (1 + 1)^1 + sum2015 (1 + 1) 1
= (0 + 0)^1 + (1 + 1)^1 + 0
= 0 + 2
= 2
相反,计算所有(m + i)^n
并在之后求和:
sum2015 :: Integer -> Integer -> Integer
sum2015 m n = sum . map (\i -> (m + i) ^ n) $ [m..n]
或者,如果您不允许使用它,请使用工作人员:
sum2015 :: Integer -> Integer -> Integer
sum2015 m n = go m
where go i = ...
答案 1 :(得分:1)
我可以提供这个选项:
sum2015 m n = sum [(m + i) ** n | i <- [m..n]]
首先,我创建了从m到n“[m..n]”的数字列表。 在此列表中的每个i之后,我计算总和的条件。 最后,只需使用“sum”函数获取结果列表。 '**' - 战俘功能