簡體   English   中英

添加了一系列指數Haskell

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM