【问题标题】:Defining an infinite sequence of Fibonacci numbers using list comprehension in Haskell在 Haskell 中使用列表推导定义无限的斐波那契数列
【发布时间】:2015-08-06 05:58:00
【问题描述】:

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

我知道列表理解是如何工作的,如何编写一个接收值的递归斐波那契函数,并且熟悉 tail 和 zip 函数 - 但是,我就是无法弄清楚这一点,也无法在网上找一个例子。谁能告诉我它是怎么做的?

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

提前感谢您的帮助。

【问题讨论】:

标签: haskell functional-programming list-comprehension fibonacci


【解决方案1】:

这里有一个提示。

取二的幂的序列。

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

【讨论】:

  • 迄今为止我见过的最好的教程! - 这值得很多赞:D - 谢谢伙计 - 我喜欢它
【解决方案2】:

这是另一种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 ...

看起来很眼熟?

现在您只需(再次)预先添加一些内容并考虑 shift left 在这里的含义(hint 你提到过):

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 (+)很好地总结

玩得开心

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 2014-05-19
    • 2011-02-17
    • 2013-04-29
    • 2017-07-11
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多