今天给各位分享斐波那契递归时间复杂度的知识,其中也会对斐波那契十句口诀进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录
- 斐波那契数列的通项公式有什么简单的推导方式
- 斐波那契数列两种算法的时间复杂度
- 算法设计(c++):计算斐波那契额数列模1000000007
- 时间复杂度(斐波那契数列演变)
- 求解斐波那契数列的时间复杂度,分别用递归和非递归 ***
- 数组求斐波那契数列第n项
一、斐波那契数列的通项公式有什么简单的推导方式
1、斐波那契数列是一个著名的数列,它的前两项为0和1,后面的每一项都是前两项的和。这个数列有很多有趣的性质和应用,例如在自然界中的黄金分割、在音乐理论中的音阶等。
2、斐波那契数列的通项公式可以通过递归的方式来推导。首先,我们定义斐波那契数列为F(n),其中n表示数列的第n项。根据斐波那契数列的定义,我们知道F(0)=0,F(1)=1。
3、接下来,我们可以定义一个递归函数F(n)来表示斐波那契数列的第n项。这个函数可以定义为:
4、这个递归关系式的意思是,斐波那契数列的第n项等于第n-1项和第n-2项的和。通过这个递归关系式,我们可以很容易地计算出斐波那契数列的前几项。
5、然而,这个递归关系式只能用于计算较小的斐波那契数。当n较大时,递归计算会变得非常慢,因为我们需要重复计算很多次相同的子问题。为了解决这个问题,我们可以使用动态规划的 *** 来计算斐波那契数列。
6、动态规划是一种高效的解决问题的 *** ,它通过将问题分解为子问题,并将子问题的解存储起来,以避免重复计算。对于斐波那契数列,我们可以使用一个数组dp来存储已经计算过的斐波那契数。dp[i]表示斐波那契数列的第i项。
7、初始时,dp[0]=0,dp[1]=1。然后,我们可以使用以下递推关系式来计算dp[i]:
8、通过不断地更新dp数组,我们可以高效地计算出斐波那契数列的第n项。这种 *** 的时间复杂度为O(n),比递归 *** 要快得多。
9、除了动态规划 *** ,还有其他一些高效的算法来计算斐波那契数列,例如矩阵乘法、快速幂等。这些算法都可以在较短的时间内计算出较大的斐波那契数。
二、斐波那契数列两种算法的时间复杂度
*这是2018王道数据结构考研复习指导的之一章思维拓展的题目。
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的 *** 定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
求解斐波那契数列的F(n)有两种常用算法:递归算法和非递归算法。试分析两种算法的时间复杂度。*
求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),又必须先计算F(n-3)和F(n-4)。。。。。。以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,从而得到F(n)要计算很多重复的值,在时间上造成了很大的浪费,算法的时间复杂度随着N的增大呈现指数增长,时间的复杂度为O(2^n),即2的n次方。
从n(>2)开始计算,用F(n-1)和F(n-2)两个数相加求出结果,这样就避免了大量的重复计算,它的效率比递归算法快得多,算法的时间复杂度与n成正比,即算法的时间复杂度为O(n).
三、算法设计(c++):计算斐波那契额数列模1000000007
1、在做编程题目的时候经常会遇到“斐波那契数列”相关的题目,尤其在做OJ中。下面说一些 *** :
2、递归是最慢的会发生重复计算,时间复杂度成指数级。
3、else return fac(n-1)+fac(n-2);
4、利用临时变量来保存中间的计算过程,加快运算。
5、(三)矩阵乘法+空间换时间(减少乘法,取模运算)
6、数列的递推公式为:f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)(n>=3)
7、进一步,可以得出直接推导公式:
8、由于矩阵乘法满足结合律,在程序中可以事先给定矩阵的64,32,16,8,4,2,1次方,加快程序的执行时间。(有些题目需要取模运算,也可以事先进行一下)。给定的矩阵次幂,与二进制有关是因为,如下的公式存在解,满足Xi={0或1}:
9、为了保证解满足Xi={0或1},对上述公式的求解从右向左,即求解顺序为Xn,Xn-1,Xn-2,....,X1,X0。
10、///求解fac(n)%100000,其中n为大于等于3的正整数
11、long long fac_tmp[6][4]={///存放矩阵次幂
12、{24578,78309,78309,46269},///32次幂%100000
13、{1597,987,987,610},///16次幂%100000
14、 long long t00=1,t01=1,t10=1,t11=0;///表示矩阵的1次幂
15、 k=k-3;///公式中是n-2次幂,(t00,t01,t10,t11)表示1次幂。所以一共减3次
16、 for(i=k;i>=32;i=i-32)///对于大于等于32的k;
17、 a=(t00*fac_tmp[0][0]+t01*fac_tmp[0][2])%100000;
18、 b=(t00*fac_tmp[0][1]+t01*fac_tmp[0][3])%100000;
19、 c=(t10*fac_tmp[0][0]+t11*fac_tmp[0][2])%100000;
20、 d=(t10*fac_tmp[0][1]+t11*fac_tmp[0][3])%100000;
21、 while(i>=0)///对于小于32的k(16,8,4,2,1);
22、 if(k>=(long long)pow(2,i))///如果k大于某一个2的次幂
23、 a=(t00*fac_tmp[5-i][0]+t01*fac_tmp[5-i][2])%100000;///(5-i):矩阵的2的i次幂在数组fac_tmp中的位置为fac_tmp[5-i]
24、 b=(t00*fac_tmp[5-i][1]+t01*fac_tmp[5-i][3])%100000;
25、 c=(t10*fac_tmp[5-i][0]+t11*fac_tmp[5-i][2])%100000;
26、 d=(t10*fac_tmp[5-i][1]+t11*fac_tmp[5-i][3])%100000;
四、时间复杂度(斐波那契数列演变)
常数阶算法运行的次数是一个常数,如5、20、100。常数阶算法时间复杂度通常用O(1)表示。例如:
很多算法时间复杂度是多项式,通常用O(n)、O(n²)、O(n³)等表示。例如:
指数阶时间复杂度运行效率极差,程序往往像躲“魔鬼”一样避开它,常见的有O(2 n)、O(n!)、O(n n)等。使用这样的算法需要谨慎,例如斐波那契数列的正常递归实现
对数阶时间复杂度运行效率较高,常见的有O(logn),O(nlogn)等,例如:
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2 n)<O(n!)<O(n n)
后一项是前两项之和, 1 1 2 3 5 8 13
算法优化(也可以使用尾递归):
五、求解斐波那契数列的时间复杂度,分别用递归和非递归 ***
转一个牛人的博客,链接:;
讲的很清楚,递归可以近似为二叉树,非递归是for循环,这里防止博客过期,就crtl+c+v了==;
returnfibonacci(n-1)+fibonacci(n-2);
}
针对递归 *** 的教学,斐波那数列可能是最常用来拿来举例的了;
针对递归 *** 的教学,斐波那数列可能是最常用来拿来举例的了;
但是,实际计算时绝不推荐使用递归 *** ,很容易stackoverflow;
可以在浏览器中计算个fibonacci(100)试试。而且其时间复杂度为指数级,可以近似认为是2^n,当然准确点可能是1.6^n;
其时间复杂度的计算:递推关系式为f(n)=f(n-1)+f(n-2);
显然是一个2阶常系数查分方程,其特征方程为x^2-x-1=0;
得其解x,时间复杂度为O(1.618^n);
或者另一种思路:该 *** 的递归求解过程其实就是其二叉树展开的过程,时间复杂度就是计算该二叉树的节点个数:树高n层,但不是满二叉树,忽略常数,是O(2^n)
将递归展开,以循环方式计算
链接:
六、数组求斐波那契数列第n项
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
斐波那契数列指的是这样一个数列:
0、1、1、2、3、5、8、13、21、34……
有一组数列,它的之一项为1,第二项为1,从第三项开始,每一项为前两项之和。
斐波那契数列的第n项Fn可以通过如下的递归公式定义:
F(n)=F(n-1)+F(n-2)(n≥ 3,n∈ N*)
如上,又称为“比内公式”,是用无理数表示有理数的一个范例。
注:此时a1=1,a2=1,a(n)=a(n-1)+a(n-2),(n≥ 3,n∈ N*)
现在写一个函数int fib(int n)返回第n项Fn。例如,若n=0,则函数fib(0)应该返回0,若n=1,则函数fib(1)应返回1,若 n> 1,返回 F(n-1)+F(n-2)。
下面是返回斐波那契数列第n项Fn的不同 *** :
一个简捷的 *** 是直接使用递归定义关系式写出递归实现的代码,C/C++代码如下:
//Fibonacci Series using Recursion
时间复杂度:T(n)= T(n-1)+ T(n-2),该时间复杂度是指数级别的
空间复杂度:如果考虑递归调用时栈的大小,则为O(n);如果不考虑调用栈的话,则为O(1)
通过观察,我们可以发现递归求解时做了很多重复的工作(见下面的递归调用树)。因此采用递归方式求解斐波那契数列的第n项Fn不是一种好的 *** 。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!