簡體   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