在Haskell中,如何基于第n个Fibonacci数等于第(n-2)个Fibonacci数加上第(n-1)个Fibonacci数的属性生成Fibonacci数?
我见过这个:
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
我真的不明白,或者它是如何产生无限列表而不是包含3个元素的列表.
我如何通过计算实际定义来编写haskell代码,而不是通过使用list函数做一些非常奇怪的事情?
我在Haskell中看到了斐波那契数的这种实现方式,但我仍在试图弄清楚为什么它可以正常工作。因此,很显然,可以使用zipWith函数以非常紧凑的方式编写斐波那契数。该实现如下所示
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
为了更好地了解此处发生的情况,我查看了zipWith函数的文档。此函数使用给定的函数(a-> b-> c)将两个列表[a],[b]一起添加。在我们的例子中,该功能是一个简单的添加。如果两个列表[a]和[b]的长度不同(在我们的例子中,列表[b]总是比列表[a]短一个元素),则zipWith只是从两个列表的开头开始并将它们相加。如果到达一个列表的末尾,则无论已到达另一个列表的末尾,它都会停止。
在递归的第一步中,使用[0,1]和tail [0,1] = [1]调用zipWith。这导致另一个1 => [0,1,1]。在递归的第二步中,使用[0,1,1]和[1,1]调用zipWith,导致[0 + 1,1 + 1] = [1,2]。因此,对我来说,很明显,递归创建了正确的斐波那契数字,但是我不完全理解为什么仅将zipWith步骤之后的最后一个数字添加到结果中,而不是整个列表中。也许有人可以向我解释。那会很有帮助。非常感谢你。