如何在haskell中使用以下方法获得无限的权力列表

时间:2012-11-18 16:47:27

标签: haskell

我一直在努力做一个无限的权力列表,就像我在下面所做的那样,获得斐波那契数和阶乘的列表。

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

facs = 1 : zipWith (*) [1 ..] facs

由于

5 个答案:

答案 0 :(得分:6)

生成数字的幂就像使用'iterate'一样简单:

iterate (*2) 1

要查找特定的权力(而不是列出它们),使用(^)会更快。要查看大型乘法的各个步骤,您可以使用scanl

scanl (*) 1 [2, 3, 5, 7]

最后要生成所有方块的列表,这是我推荐的方法:

fix (\more r s -> s : more (r + 1) (s + 2*r + 1)) 0 0

如果您对fix感到不舒服,这里有两个替代版本:

unfoldr (\(r, s) -> Just (s, (r + 1, s + 2*r + 1))) (0, 0)

map snd . iterate (\(r, s) -> (r + 1, s + 2*r + 1)) $ (0, 0)

答案 1 :(得分:3)

我认为你可以用列表理解来定义一个无限的正方形序列:

powers = [ ii*ii | ii <- [1 ..]]

take 10 powers
=> [1,4,9,16,25,36,49,64,81,100]

编辑:已经解释过你是在2的权力之后,这也可以通过列表理解来完成:

powersOf2 = [ 2^ii | ii <- [0 ..]]
take 10 powersOf2
=> [1,2,4,8,16,32,64,128,256,512]

您可以将其推断为任何给定基数的生成函数:

powersOfN nn = [ nn^ii | ii <- [0 ..]]

take 10 (powersOfN 3)
=> [1,3,9,27,81,243,729,2187,6561,19683]

take 10 (powersOfN 17)
=> [1,17,289,4913,83521,1419857,24137569,410338673,6975757441,118587876497]

答案 2 :(得分:2)

powers n = 1 : map (n*) (powers n)

答案 3 :(得分:2)

为了更好的可读性,您还可以使用map

2的连续权力列表:

λ> map (2^) [0..10]
[1,2,4,8,16,32,64,128,256,512,1024]

连续方格:

λ> map (^2) [0..10]
[0,1,4,9,16,25,36,49,64,81,100]

答案 4 :(得分:0)

如果您想通过 zipWith 来获得N的幂的无限列表,这可能是一种简单的方法:

powersOfN :: [Integer]
powersOfN
  = zipWith (^) [N,N..] [0,1..]

以下是2的幂的示例:

Prelude> zipWith (^) [2,2..] [0,1..]
=>[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728..]