了解Haskell中的递归斐波那契函数

Ayd*_*sar 1 haskell fibonacci

尽管可以使用此线程,但是由于答案的不同,我不允许在答案下问我的问题,因此我不得不为此创建一个新问题。(我只是stackoverflow中的新手:)

关于以下fib功能如何工作,我并不清楚

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)

在这个stackoverflow线程中

nichijou逐步解释了我从nichijou引用的以下线程:

首先,我们使用fib和tail fib可以得到第3个:

fibs                        : [1, 1, ?
tail fibs                   : [1, ?
zipWith (+) fibs (tail fibs): [2, ?
Run Code Online (Sandbox Code Playgroud)

现在,我们知道第三个是2,我们可以得到第四个:

fibs                        : [1, 1, 2, ?
tail fibs                   : [1, 2, ?
zipWith (+) fibs (tail fibs): [2, 3, ?
Run Code Online (Sandbox Code Playgroud)

现在的第五名:

fibs                        : [1, 1, 2, 3, ?
tail fibs                   : [1, 2, 3, ?
zipWith (+) fibs (tail fibs): [2, 3, 5, ?
Run Code Online (Sandbox Code Playgroud)

等等 ..

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)

我的问题是,在第二步之后,我们如何摆脱列表中的重复项?我期望看到第二步应该生成一个列表

[1, 1, 2, 2, 3] 
Run Code Online (Sandbox Code Playgroud)

下一步也是如此...

lef*_*out 6

让我们用更多的标签写出来:

fibs :: [Integer]
fibs = 1 : 1 : sumft
 where sumft = zipWith (+) fibs tfi
       tfi = tail fibs
Run Code Online (Sandbox Code Playgroud)

然后,“开始步骤”是

           ??? tfi ?????????··
fibs:[1、1,?,?,...
              ??? sumft ????··
tfi:[1,?,?,?,... 
sumft:[2,?,?,?,

现在,随着计算的进行,运行时不会移动任何东西,它只是尝试?用具体值填充符号。请记住,Haskell中的所有内容都是不可变的。当我写的时候,?我只是说我不知道​​它的值是什么,但是原则上它已经预先确定了。

在这种情况下,运行时知道第一个?输入fibs来自的头部sumft,现在确切的值已经知道:

           ???? tfi ????????··
fibs:[ 1、2,?,...
              ??? sumft ????··
tfi:[1,?,?,?,... 
sumft:[ 2,?,?,?,

现在,这2也被称为tfi

           ???? tfi ????????··
fibs:[ 1、2,?,...
              ??? sumft ????··
tfi:[ 1、2,?,?,...
sumft:[2,?,?,?,

...因此我们可以执行下一个添加:

           ???? tfi ????????··
小谎:1,1?2,...
              ??? sumft ????··
tfi:[ 1、2,?,?,...
sumft:[2,3,?,?,

所以,另一种数量,即的另一个元件sumft是,为的一部分fibs,也可在此使用。但是,相对于-的头部,sumft它仍然出现在同一位置即在2

           ???? tfi ????????··
fibs:[ 1、2、3,...
              ??? sumft ????··
tfi:[1、2,?,?,... 
sumft:[2,3,?,?,

再次用于 tfi

           ???? tfi ????????··
fibs:[ 1、2、3,...
              ??? sumft ????··
tfi:[ 1、2、3,?,...
摘要:[2,3,?,?,

...等等等等。