繁体   English   中英

Haskell中的斐波那契无限列表

[英]Fibonacci infinite list in Haskell

我想创建一个斐波那契数字列表。 我想叫fib x,它应该给我一个列表,直到第x个元素为止。 我该如何实现。

我会这样计算fib数:

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

如何将结果放入列表中以调用列表,直到需要所需的元素?

紧凑的定义(线性缩放)如下:

fib :: Num n => [n]
fib = 0 : nxt
    where nxt = 1 : zipWith (+) fib nxt

fibN :: Num n => Int -> [n]
fibN = flip take fib

我们在这里所做的是构造一个列表fib ,该列表fib0nxt (其余列表)。 where子句nxt定义为1的“ cons”,并将zipWith (+) fib nxt的结果定义为zipWith (+) fib nxt zipWith elementwise将fibnxt的元素nxt在一起,因为nxt始终是fib “一个”元素,因此我们将最后两个元素加在一起。 然后,我们take fibN函数中的前n元素。

因此,我们获得如下列表:

   fib          nxt
    |            |
    v            v
+-------+    +-------+    +-------------+
|  (:)  | ,->|  (:)  | ,->|   zipWith   |
+---+---+ |  +---+---+ |  +-----+---+---+
| 0 | o---'  | 1 | o---'  | (+) | o | o |
+---+---+    +---+---+    +-----+-|-+-|-+
  ^            ^                  |   |
  |            `------------------|---'
  `-------------------------------'

如果这样我们最多求第三个元素,这意味着我们调用zipWith ,这将产生fibnxt的头的总和,并提前两点,例如:

   fib          nxt
    |            |
    v            v
+-------+    +-------+    +-------+    +-------------+
|  (:)  | ,->|  (:)  | ,->|  (:)  | ,->|   zipWith   |
+---+---+ |  +---+---+ |  +---+---+ |  +-----+---+---+
| 0 | o---'  | 1 | o---'  | 1 | o---'  | (+) | o | o |
+---+---+    +---+---+    +---+---+    +-----+-|-+-|-+
               ^            ^                  |   |
               |            `------------------|---'
               `-------------------------------'

等等。

这不是一种快速的方法(因为您的函数以指数形式运行),而是使用函数fib

nfibs :: Int -> [Integer]
nfibs n = take n (map fib [0..])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM