使用Haskell中的列表推导定义无限的Fibonacci数序列

时间:2015-05-24 18:11:15

标签: haskell functional-programming list-comprehension fibonacci

我该怎么做?这是我演讲幻灯片中练习的一部分,提示是使用库函数tail :: [a] -> [a]zip :: [a] -> [b] -> [(a,b)]。此外,函数的类型是fibs :: [Integer]

我知道列表理解是如何工作的,如何编写一个递归的Fibonacci函数,它接受一个值并且熟悉tail和zip函数 - 但是,我只是无法弄清楚这一个并且还不能在线查找示例。任何人都可以告诉我它是如何完成的吗?

同样出于好奇,Haskell中使用的函数如何(产生无限列表)?如果我在ghci命令提示符中写fibs(函数名),例如它是否会继续打印列表中的元素,直到时间结束?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

这是一个提示。

采用两个权力的顺序。

p2 = [1, 2, 4, 8, 16 ...

zip它本身

zip p2 p2 = [(1,1), (2,2), (4,4), ...]

对列表中的每一对求和(这可以使用列表推导完成)

[2, 4, 8, ...

前置1

[1, 2, 4, 8, ...

所以我们再次获得p2列表。如果你在Haskell中表达了所有这些,你最终得到了一些形式的代码

p2 = 1 : ... something involving p2 ...

这是一个产生两个权力的工作程序。

一旦你开始工作,你可以稍微改变 并获得斐波纳契。

最后一点:是的,打印p2将打印整个无限序列。您可以使用

打印几个元素
take 10 p2

答案 1 :(得分:3)

这是另一种 chi 风格(我希望你不要介意):

写下文:

fibs = 1 1 2 3 5 8 13 ...

再次写下来,但左移一个:

fibs       = 1 1 2 3 5 8 13 ...
(??? fibs) = 1 2 3 5 8 13 ...

添加它们:

fibs       = 1 1 2 3 5 8 13 ...
(??? fibs) = 1 2 3 5 8 13 ...
--------------------
(+ em)     = 2 3 5 8 13 21 ...

看起来很熟悉?

现在你只需要预先添加一些内容(并再次)并考虑左移意味着什么(提示你提到它):

fibs       = 1 1 2 3 5 8 13 ...
(??? fibs) = 1 2 3 5 8 13 ...
--------------------
(+ em)     = 2 3 5 8 13 21 ...
=> fibs = ? : ((+ em) fibs (??? fibs))

使用zipWith (+)

可以很好地总结

玩得开心

相关问题