我目前正試圖計算以下總和:我該如何計算Σ_{i = m}^n(m + i)^ n?
sum2015 :: Integer->Integer->Integer
sum2015 m n
| m>n = 0
| otherwise = (m+m)^n + sum2015 (m+1) n
舉個例子,sum2015 0 1
應該返回1
。但是,它返回2
。我做錯了什麼?
我目前正試圖計算以下總和:我該如何計算Σ_{i = m}^n(m + i)^ n?
sum2015 :: Integer->Integer->Integer
sum2015 m n
| m>n = 0
| otherwise = (m+m)^n + sum2015 (m+1) n
舉個例子,sum2015 0 1
應該返回1
。但是,它返回2
。我做錯了什麼?
你不計算那筆錢。需要注意的是m
在(m + i)^n
必須保持固定的,但是你用一個新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 = ...
我可以提供此選項:
sum2015 m n = sum [(m + i) ** n | i <- [m..n]]
首先,我創建從m至n個 「[m..n]」 號碼列表。 對於每個我在這個列表中,我計算總和的條款。 最後,只需使用「求和」函數獲得結果列表。 '**' - Pow功能
我們尚未學會使用.map(\ i - >(m + i)^ n)$ [m..n]。 我怎麼能做不同? – Chryssa 2015-03-19 12:27:24
@ChryssaTerizi:對不起,我的互聯網目前無法正常工作。您只需使用另一個使用'i'的函數。我將這部分作爲練習。 – Zeta 2015-03-19 12:34:37
@ChryssaTerizi你知道列表解析嗎? 'map(\ i - >(m + i)^ n)$ [m..n]'='[(m + i)^ n)|我< - [m..n]]' – Franky 2015-03-19 12:39:53