我该怎么做?这是我演讲幻灯片中练习的一部分,提示是使用库函数tail :: [a] -> [a]
和zip :: [a] -> [b] -> [(a,b)]
。此外,函数的类型是fibs :: [Integer]
我知道列表理解是如何工作的,如何编写一个递归的Fibonacci函数,它接受一个值并且熟悉tail和zip函数 - 但是,我只是无法弄清楚这一个并且还不能在线查找示例。任何人都可以告诉我它是如何完成的吗?
同样出于好奇,Haskell中使用的函数如何(产生无限列表)?如果我在ghci命令提示符中写fibs
(函数名),例如它是否会继续打印列表中的元素,直到时间结束?
提前感谢您的帮助。
答案 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 (+)
玩得开心