转自知乎王希的回答。原文链接:http://www.zhihu.com/question/28062458/answer/39763094
一句话先回答问题:因为斐波那契数列在数学和生活以及自然界中都非常有用。
下面我就尽我所能,讲述一下斐波那契数列。
一、起源和定义
斐波那契数列最早被提出是印度数学家Gopala,他在研究箱子包装物件长度恰好为1和2时的方法数时首先描述了这个数列。也就是这个问题:
有n个台阶,你每次只能跨一阶或两阶,上楼有几种方法?
- 第一个月初有一对刚诞生的兔子
- 第二个月之后(第三个月初)它们可以生育
- 每月每对可生育的兔子会诞生下一对新兔子
- 兔子永不死去
int Fib(int n)
{
return n < 2 ? 1 : (Fib(n-1) + Fib(n-2));
}
int Fib[1000];
Fib[0] = 0;Fib[1] = 1;
for(int i = 2;i < 1000;i++) Fib[i] = Fib[i-1] + Fib[i-2];
int Qpow(int a,int n)
{
int ans = 1;
while(n)
{
if(n&1) ans *= a;
a *= a;
n >>= 1;
}
return ans;
}
#include <cstdio>
#include <iostream>
using namespace std;
const int MOD = 10000;
struct matrix//定义矩阵结构体
{
int m[2][2];
}ans, base;
matrix multi(matrix a, matrix b)//定义矩阵乘法
{
matrix tmp;
for(int i = 0; i < 2; ++i)
{
for(int j = 0; j < 2; ++j)
{
tmp.m[i][j] = 0;
for(int k = 0; k < 2; ++k)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
}
}
return tmp;
}
int fast_mod(int n) // 求矩阵 base 的 n 次幂
{
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化为单位矩阵
ans.m[0][1] = ans.m[1][0] = 0;
while(n)
{
if(n & 1) //实现 ans *= t; 其中要先把 ans赋值给 tmp,然后用 ans = tmp * t
ans = multi(ans, base);
base = multi(base, base);
n >>= 1;
}
return ans.m[0][1];
}
int main()
{
int n;
while(scanf("%d", &n) && n != -1)
{
printf("%d\n", fast_mod(n));
}
return 0;
}
每3个连续的斐波那契数有且只有一个被2整除,
每4个连续的斐波那契数有且只有一个被3整除,
每5个连续的斐波那契数有且只有一个被5整除,
每6个连续的斐波那契数有且只有一个被8整除,
每7个连续的斐波那契数有且只有一个被13整除,
…………
每n个连续的斐波那契数有且只有一个被整除.
(3)一些恒等式
3.杨辉三角中的斐波那契数列
如图所示,每条斜线上的数的和就构成斐波那契数列。
即有
4.相关数列:卢卡斯(Lucas)数列
卢卡斯数列的定义除了第0项为2之外,与斐波那契数列完全一致。即
其通项公式为:
卢卡斯数列和斐波那契数列有这些关系:
5.组合数学
(1)一些恒等式
(2)同余特性
当p为大于5的素数时,有:
其中
斐波那契数列还有许许多多的性质,我就不再一一介绍了。跑题了这么久,终于开始要真正回答问题了:斐波那契数列有什么用?
四、斐波那契数列的应用
1.算法
a.斐波那契堆
斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质,可用于实现合并优先队列。特点是不涉及删除元素的操作有O(1)的平摊时间,用途包括稠密图每次Decrease-key只要O(1)的平摊时间,和二项堆的O(lgn)相比是巨大的改进。
斐波那契堆由一组最小堆构成,这些最小堆是有根的无序树。可以进行插入、查找、合并和删除等操作
1)插入:创建一个仅包含一个节点的新的斐波纳契堆,然后执行堆合并
2)查找:由于用一个指针指向了具有最小值的根节点,因此查找最小的节点是平凡的操作。
3)合并:简单合并两个斐波纳契堆的根表。即把两个斐波纳契堆的所有树的根首尾衔接并置。
4)删除(释放)最小节点
分为三步:
5)降低一个点的键值:对一个节点的键值降低后,自键值降低的节点开始自下而上的迭代执行下述操作,直至到根节点或一个未被标记(marked)节点为止:
- 查找最小的根节点并删除它,其所有的子节点都加入堆的根表,即它的子树都成为堆所包含的树;
- 需要查找并维护堆的最小根节点,但这耗时较大。为此,同时完成堆的维护:对堆当前包含的树的度数从低到高,迭代执行具有相同度数的树的合并并实现最小树化调整,使得堆包含的树具有不同的度数。这一步使用一个数组,数组下标为根节点的度数,数组的值为指向该根节点指针。如果发现具有相同度数的其他根节点则合并两棵树并维护该数组的状态。
- 对当前堆的所有根节点查找最小的根节点。
如果当前节点键值小于其父节点的键值,则把该节点及其子树摘下来作为堆的新树的根节点;其原父节点如果是被标记(marked)节点,则也被摘下来作为堆的新树的根节点;如果其原父节点不是被标记(marked)节点且不是根节点,则其原父节点被加标记。
如果堆的新树的根节点被标记(marked),则去除该标记。
6)删除节点:把被删除节点的键值调整为负无穷小,然后执行“降低一个节点的键值”算法,然后再执行“删除最小节点”算法。
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
假定我们现在有一些氢气原子,一个电子最初所处的位置是最低的能级(Ground lever of energy),属于稳定状态。它能获得一个能量子或二个能量子(Quanta of energy)而使它上升到第一能级或者第二能级。但是在第一级的电子如失掉一个能量子就会下降到最低能级,它如获得一个能量子就会上升到第二级来。
现在研究气体吸收和放出能量的情形,假定最初电子是处在稳定状态即零能级,然后让它吸收能量,这电子可以跳到第1能级或第2能级。然后再让这气体放射能量,这时电子在1级能级的就要下降到0能级,而在第2能级的可能下降到0能级或者第1能级的位置去。
电子所处的状态可能的情形是:1、2、3、5、8、13、21…种。这是斐波那契数列的一部份。
一名13岁的男孩根据斐波那契数列发明了太阳能电池树,其产生的电力比太阳能光伏电池阵列多20-50%。斐波那契数列类似从0和1开始,之后的数是之前两数的和,如0,1,1,2,3,5,8,13,21...Aidan Dwye在观察树枝分叉时发现它的分布模式类似斐波那契数列,这是大自然演化的一种结果,可能有助于树叶进行光合作用。
因此,Dwye猜想为什么不按照斐波那契数列排列太阳能电池?他设计了太阳能电池树,发现它的输出电力提高了20%,每天接受光照的时间延长了2.5小时。
妈妈摇椅是设计师Patrick Messier为自己的妻子兼合作伙伴Sophie Fournier设计的,当时他们刚有了第一个宝宝。
当Sophie宣布自己怀孕时,她说想要一把摇椅,但发现没有一把摇椅能满足美观舒适的标准,于是Patrick决定自己做一把。
于是就有了这把妈妈摇椅。像是一个飘在空中的丝带,由一片纤维玻璃做成,曲线服从斐波那契数列分布,经过特殊的高光聚氨酯处理。
fibonacci数列为什么那么重要,所有关于数学的书几乎都会提到?【转自知乎】
原文地址:http://blog.csdn.net/dreamon3/article/details/44115289