2015-03-19 98 views
1

我目前正試圖計算以下總和:我該如何計算Σ_{i = m}^n(m + i)^ n?

Imgur

sum2015 :: Integer->Integer->Integer 
sum2015 m n 
| m>n = 0 
| otherwise = (m+m)^n + sum2015 (m+1) n 

舉個例子,sum2015 0 1應該返回1。但是,它返回2。我做錯了什麼?

回答

4

你不計算那筆錢。需要注意的是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 = ... 
+0

我們尚未學會使用.map(\ i - >(m + i)^ n)$ [m..n]。 我怎麼能做不同? – Chryssa 2015-03-19 12:27:24

+0

@ChryssaTerizi:對不起,我的互聯網目前無法正常工作。您只需使用另一個使用'i'的函數。我將這部分作爲練習。 – Zeta 2015-03-19 12:34:37

+0

@ChryssaTerizi你知道列表解析嗎? 'map(\ i - >(m + i)^ n)$ [m..n]'='[(m + i)^ n)|我< - [m..n]]' – Franky 2015-03-19 12:39:53

1

我可以提供此選項:

sum2015 m n = sum [(m + i) ** n | i <- [m..n]] 

首先,我創建從m至n個 「[m..n]」 號碼列表。 對於每個我在這個列表中,我計算總和的條款。 最後,只需使用「求和」函數獲得結果列表。 '**' - Pow功能

+0

感謝您的幫助。它花了我時間,但我解決了它!我使用了另一個功能 'sum2 x y z' '| x> y = 0' '|否則=(z + x)^ y + sum2(x + 1)y z' 實際上,我保留變量z的值爲m,我稱它爲這些值 'sum2015 m n = sum2 m n m' 它的工作原理! – Chryssa 2015-03-19 19:34:24

+1

@ChryssaTerizi:本質上是工作者'go';)。 – Zeta 2015-03-19 19:39:04