添加了一系列指数Haskell

时间:2014-10-12 16:00:48

标签: haskell recursion

一个非常简单的for循环就足以满足我之前所知的任何语言

amount = 0

for(r=0, r<64, r++){

    amount+=2^r

}

我如何在Haskell中解决这个问题。我试过了一个递归函数。

4 个答案:

答案 0 :(得分:2)

您可以使用列表推导来获取无限列表,然后只取出前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]]

答案 1 :(得分:1)

这是一个几何系列:

amount = a
for (r=0, r<N, r++) {
  amount += k^r
}

相当于:

amount = (k^N - 1)/(k - 1) + a

明确评估恒定时间。在您的情况下,表达式只是2^64-1

答案 2 :(得分:0)

由于您正在做的是从2的幂列表中添加前64个值,fold函数将适合该任务。您可以使用foldl'功能,如下所示:

import Data.List(foldl')

sumfunc :: Int -> Integer
sumfunc x = foldl' (+) 0 $ map (2 ^) [0..x-1]

美元符号后面的部分用于构建前64个幂的列表2.美元符号前面的部分用于将值与初始值0一起添加。注意结果值是指定的作为Integer以避免溢出错误。

答案 3 :(得分:0)

您可以在Haskell中编写类似的循环:

Prelude> import Data.List (foldl')

Prelude Data.List> foldl' (\amount r -> amount + 2^r) 0 [0..63]

18446744073709551615
相关问题