[英]The addition of a sequence of exponents Haskell
在我所知的任何以前的語言中,一個非常簡單的for循環就足夠了
amount = 0
for(r=0, r<64, r++){
amount+=2^r
}
我將如何在Haskell中解決這個問題。 我試過一個遞歸函數。
您可以使用列表推導來獲得無限列表,然后只取出它們中的前64個,最后將它總結為這樣
main = print $ sum (take 64 [2 ^ x | x <- [0..]])
-- 18446744073709551615
這里,
[2 ^ x | x <- [0..]]
這部分應該生成一個無限列表,其中x
取值從0
到無窮大,對於x
每個值,我們得到相應的2 ^ x
。 由於我們只需要前64個項目,因此我們使用take 64
來獲取它們並使用內置sum
函數添加所有這些項目。
甚至更簡單,正如Zeta建議的那樣,我們只能生成前64個數字,並像這樣添加它們
main = print $ sum [2 ^ x | x <- [0..63]]
這是一個幾何系列:
amount = a
for (r=0, r<N, r++) {
amount += k^r
}
相當於:
amount = (k^N - 1)/(k - 1) + a
這顯然是在不斷的時間內評估的。 在您的情況下,表達式只是2^64-1
由於您正在做的是將權力列表中的前64個值相加,因此fold
函數將適合該任務。 您可以使用foldl'
函數,如下所示:
import Data.List(foldl')
sumfunc :: Int -> Integer
sumfunc x = foldl' (+) 0 $ map (2 ^) [0..x-1]
美元符號后面的部分用於構建前64個冪的列表2.美元符號之前的部分用於將值與初始值0一起添加。注意,結果值被指定為Integer
避免溢出錯誤。
您可以在Haskell中編寫類似的循環:
Prelude> import Data.List (foldl')
Prelude Data.List> foldl' (\amount r -> amount + 2^r) 0 [0..63]
18446744073709551615
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.