斐波那契数列递归与非递归精讲

  斐波那契数列是学习算法的入门级算法,要对算法进行研究的话我们就必须的掌握斐波那契数列算法。以下从斐波那契数列的简介,递归算法和非递归算法给大家进行介绍。

  简介:

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。(百度百科)

递归算法:

什么是递归算法?我将递归算法理解为一个函数的重复调用。F(n)=F(n-1)+F(n-2)。那么重复调用的函数就是F(x)(x可以是任意的正整数)。这个公式的意思是F(n)的值等于其F(n-1)的值加上F(n-2)的值。假如我们求n=3的值,就是F(3)=F(2)+F(1)。由于F(2)=1,F(1)=1,这两个就是我们要找的结束条件。

递归算法的两个必要的条件:1.循环的部分。2.结束条件。我们已经找到这两个条件了,那么我们来编写代码。

int F(int n)//递归
{
	if (n == 1)
	{
		return 0;
	}
	if (n == 2)
	{
		return 1;
	}
	return F(n - 1) + F(n - 2);
}

递归算法的时间复杂度是O(2^n)。别去深究记住就行,反正我是看了半天都看不明白。

非递归算法:

由于递归算法的时间复杂度非常的高,并且在其中还有许多重复的计算,如图所示:

可以看到如果使用递归的方法来计算的话F(4)执行了1次,F(3)执行了2次,F(2)执行了3次,F(1)执行了2次。本来只需要每一个进行一次运算的可是却重复计算了很多。当n很大的时候就会使执行的速度变得很慢。

再来看看原来的式子:F(n)=F(n-1)+F(n-2),F(3)=F(2)+F(1),F(4)=F(3)+F(2)可以发现。要求的那一项等于其前两项之和。根据这个规则,运用for循环就能解决了。

int F(int n)
{
	if (n == 1)
	{
		return 0;
	}
	if (n == 2)
	{
		return 1;
	}
	int f1 = 0;
	int f2 = 1;
	int c = 0;
	for (int i = 3; i <= n; i++)
	{
		c = f1 + f2;
		f1 = f2;
		f2 = c;
	}
 
	return c;
}                   

我们要求n=5的时候,那么就肯定得求出n=3,n=4的值。当要求n=6的时候肯定要求出n=5,n=4的值,n=5的值就必然要求n=3的值。因此我们求n的值时,就必然要求n=3的值,当要求n=3的值的时候,就必然要求n=2,n=1的值。

这就是非递归的思想,从低的值往高的值求。算法的时间复杂度O(n)。

当i=3时,c就是F(3)的值,当i=4时,c就是F(4)的值。如果不懂的话,仔细的分析代码,你绝对能够发现其中的奥秘的。

发布了10 篇原创文章 · 获赞 4 · 访问量 596

猜你喜欢

转载自blog.csdn.net/qq_36136459/article/details/90743185