这两个Haskell函数fibonacci函数有什么区别?

时间:2017-04-23 17:44:21

标签: haskell

我是Haskell的新手,并且想知道这两个函数之间的区别是什么。

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

 fib1 = 1 :1 : [a+b | (a,b) <- zip fib1 (tail fib1)]

我想知道他们如何更清楚地工作。

我目前如何理解它们如下:

我知道第一个函数中的zipWith会将加法函数应用于两个列表,在本例中为“fibs”和“tail fibs”。但是我对递归是如何工作感到困惑。我知道fibs返回一个列表,tail fibs将是除列表头部之外的所有内容。但是,我想我对中间步骤感到困惑,以及zipWith如何递归地使用它。

在fib1中,我对“zip”有同样的问题,但是这又是如何应用于“a”和“b”的。为什么元组中的“a”和“b”呢?

如果我不是更清楚,我很抱歉。我感谢人们提供的任何帮助

提前致谢

1 个答案:

答案 0 :(得分:0)

在第一个函数中,你所拥有的是一个在列表中创建斐波那契数列的无穷递归。尾部用于指代序列中的下一个元素,用于将这两个元素添加到一起。我认为通过追踪第三个元素的创建,你会更好地理解发生的事情:

zipWith (+) fibs (tail fibs) ->
zipWith (+) (0 : 1 : zipWith (+) fibs (tail fibs)) (1 : zipWith (+) fibs (tail fibs)) ->
(0 + 1 : 1 + zipWith (+) fibs (tail fibs) : ...)

您可以看到,fibs列表中的每个元素都是通过在序列中添加其前两个数字来创建的。

在fib1中发生了类似的事情。你在序列中的两个相邻数字的元组中进行分组,然后声明列表是这两个元组的总和(你可以&#34;解决&#34;就像我上面做的那样,以便更好地理解正在发生的事情)。请注意,元组本身并不重要,只是一种传递数据的方法。您可以使用列表或用户定义的类型获得相同的效果。

如果不清楚,请告诉我。 干杯