![]() |
1
78
下面是一个计算第n个斐波那契数的不同而简单的函数:
您所指的实现是对一些关于fibonacci中的值如何相互关联的观察(以及haskell如何根据自身定义数据结构,从而创建无限的数据结构)的中继。 问题中的函数如下所示: 假设您已经拥有无限的斐波那契数列表:
这个
所以斐波那契数的无限列表可以通过在元素前加上前缀来计算。
现在,要得到第n个斐波那契数,只需得到无限长斐波那契数列表的第n个元素:
哈斯克尔的优点在于,在需要的时候,它不会计算斐波那契数列中的任何元素。 我让你的头爆炸了吗?:) |
![]() |
2
20
根据定义,斐波那契级数的每一项都是前两项的和。把这个定义放进懒惰的哈斯凯尔给了你这个!
现在从FIBO中取n项,从0,1开始
|
![]() |
3
19
扩展DTB的答案: “简单”解决方案之间有一个重要区别:
您指定的那个:
简单的解决方案需要
O(1.618
N
N)
计算第n个元素的时间,而您指定的元素取0(n
二
)那是因为你指定的那个考虑到了计算
|
![]() |
4
5
对于斐波那契序列,有许多不同的haskell算法 here . “幼稚的”实现看起来像您所追求的。 |
![]() |
5
1
fibonaci(n)的定义是:
Haskell中的幼稚实现
所有的公式都可以追溯到这个定义,有些公式运行得很快,有些公式运行得很慢。上面的实现有o(n)=2^n 本着你问题的精神,让我去掉列表的使用,给你一些O(N)中的内容。 也就是说,我们不要把所有的斐波那契数列在一个列表中,从0到n。 如果我们有三个 (包含三个成员的元组)如下所示:
记住最初的定义,我们可以从最后一个三倍计算下一个三倍 :
最后三个三倍的下一个三倍:
等等 …
让我们在Haskell中实现这个 并使用自述变量名:
这将在o(n)中起作用[它是一个温和的二次型,出现在大量的数字中。原因是增加大的数字比增加小的数字更昂贵。但这是关于计算模型的单独讨论。]
|
![]() |
6
1
此实现几乎立即计算100000个斐波那契数:
|
![]() |
7
0
一种生成无限斐波那契级数的懒惰方法可以很容易地通过
|
![]() |
8
0
lol,我喜欢haskell模式匹配,但在标准的fibonacci函数中,它是无用的。标准列表是从右边构建的。要使用模式匹配和cons,必须从左侧构建列表。好吧,至少有一个安慰是,这真的很快。~o(n),应该是。需要一个助手函数来反转无限列表(只能在haskell、joy中执行),该函数输出运行的每个后续列表,因此“last”也用于助手函数管道中。
帮手
这是一个列表版本,我认为,它解释了如何构造列表,这就是目的。我想做一个元组版本。 编辑3/15/2018 首先,will ness让我明白,在每次迭代中生成一个完整的列表是不必要的,只需要最后两个使用的值,结果列表的值是生成的每个列表或对的第一个值。真有趣。在威尔告诉我列表的值是列表的第一个值之后,我运行它并看到值0,1,1,2,3,5,8,13,作为每个列表的每个头,我说wtf,是否会在我的电脑上更改我的代码?价值观就在那里,但如何!过了一会儿,我意识到他们一直在那儿,但我只是没看见他们。呃。 will函数和helper函数的版本是:
他的助手函数重写
我认为它们现在也可以组合在一起:
除此之外,函数也可以与元组一起使用。
另一种形式,列表理解形式,也可以为所有人编写:
这些都是迭代的和健壮的。最快的是FIB 5000的列表为12.23秒的地图。fib 5000的tuple理解速度第二快,为13.58秒。 |
![]() |
9
-1
使用迭代
使用
|