一个非常简单的for循环就足以满足我之前所知的任何语言
amount = 0
for(r=0, r<64, r++){
amount+=2^r
}
我如何在Haskell中解决这个问题。我试过了一个递归函数。
答案 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