c语言斐波那契数列_神奇的数列——斐波那契数列

斐波那契数列之美

斐波那契是一位数学家,生于公元1170年,籍贯大概是比萨,卒于1240年后。1202年,他撰写了《珠算原理》(Liber Abaci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。斐波那契数列因他解决兔子繁殖的应用题而引入,故又称为“兔子数列”。除此之外,他对欧洲数学的另一大贡献就是引进阿拉伯数字,从而取代了复杂的罗马计数法。

c语言斐波那契数列_神奇的数列——斐波那契数列_第1张图片

有这样一个数列:1、1、2、3、5、8、13、21、34……前两个元素为1,其他元素均为前两个元素和。在数学上以如下递归的方法定义:

c语言斐波那契数列_神奇的数列——斐波那契数列_第2张图片

这就是斐波那契数列的数学定义。

c语言斐波那契数列_神奇的数列——斐波那契数列_第3张图片

奇妙的属性

随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887……

从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。(注:奇数项和偶数项是指项数的奇偶,而并不是指数列的数字本身的奇偶,比如第四项3是奇数,但它是偶数项,第五项5是奇数,它是奇数项,如果认为数字3和5都是奇数项,那就误解题意,怎么都说不通)

如果你看到有这样一个题目:

某人把一个8*8的方格切成四块,拼成一个5*13的长方形,故作惊讶地问你:为什么64=65?其实就是利用了斐波那契数列的这个性质:5、8、13正是数列中相邻的三项,事实上前后两块的面积确实差1,只不过后面那个图中有一条细长的狭缝,一般人不容易注意到。

斐波那契数列的第n项同时也代表了集合{1,2,...,n}中所有不包含相邻正整数的子集个数。

斐波那契数列(f(n),f(0)=0,f(1)=1,f(2)=1,f(3)=2……)的其他性质:

f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1

f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)

f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1

[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)

f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1

f(m+n-1)=f(m-1)·f(n-1)+f(m)·f(n)

利用这一点,可以用程序编出时间复杂度仅为O(log n)的程序。怎样实现呢?伪代码描述一下?

[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)

f(2n-1)=[f(n)]^2-[f(n-2)]^2

3f(n)=f(n+2)+f(n-2)

f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]

f(2n+1)=[f(n)]^2+[f(n+1)]^2

c语言斐波那契数列_神奇的数列——斐波那契数列_第4张图片

算法之矩阵计算斐波那契数列

从第三项开始,每一项都是前两项之和。 F(n)=F(n−1)+F(n−2), n⩾3 把斐波那契数列中 相邻的两项F(n)和F(n−1)写成一个2×1的矩阵。

求F(n)等于求二阶矩阵的n - 1次方,结果取矩阵第一行第一列的元素。

问题转换为二阶矩阵的n次幂。而计算二阶矩阵的N次幂运算,由于二阶矩阵乘法满足结合律,这样,可以快速计算二阶矩阵的n次幂运算。

假设A为一个二阶矩阵,则A的幂运算满足下面的条件:

A**6=A**3∗A**3

A**7=A**3∗A**3∗A**1=A**4*A**2*A**1

可以类似地把A看做是二进制中的2,2**7=2**4*2**2*2**1也就是说可以把矩阵的幂转换成二进制来表示。从而可以将n次幂拆解成长度为logn的二进制数来表示:7=111(二进制)。这就是快速求二阶矩阵的核心方法。

代码实现:

c语言斐波那契数列_神奇的数列——斐波那契数列_第5张图片

完整代码:

c语言斐波那契数列_神奇的数列——斐波那契数列_第6张图片

斐波那契数列的应用

c语言斐波那契数列_神奇的数列——斐波那契数列_第7张图片

你可能感兴趣的:(c语言斐波那契数列,c语言斐波那契数列求和,斐波那契数列前20项,斐波那契数列前n项和,c++)