温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

斐波那契序列的递归和非递归的实现

发布时间:2020-07-03 18:46:18 来源:网络 阅读:433 作者:菜鸟笔记 栏目:编程语言
  斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1])以兔子繁殖为例子而引入,故又称为“兔子数列”。
  指的是这样一个数列: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*)
  
  
#include<iostream>
using namespace std;
//递归形式
//long long  fibonacci(int i)
//{
//	return i < 2 ? i : fibonacci(i - 1) + fibonacci(i - 2);
//}
void test1()
{
	cout << fibonacci(6) << endl;;
}
//非递归形式
long long fibonacci(int n)
{
	int tem[2];
	tem[0] = 1;
	tem[1] = 1;
	if (n == 0)
	{
		return 0;
	}
	if ( n == 1)
	{
		return 1;
	}
	else
	{
		for (int i = 2; i < n; i++)
		{
			int temp = tem[0] + tem[1];
			tem[1] = tem[0];
			tem[0] = temp;
		}
		return tem[0];
	}
}
//优化    时间复杂度O(n)
long long fibonacci(int n)
{
	long long fibonacci[3] = { 0, 1, n };
	for (int i = 2; i <= n; ++i)
	{
		fibonacci[2] = fibonacci[1]+fibonacci[0];
		fibonacci[0] = fibonacci[1];
		fibonacci[1] = fibonacci[2];
	}
	return fibonacci[2];
}
int main()
{
	test1();
	system("pause");
	return 0;
}

     斐波那契序列的递归和非递归的实现

斐波那契序列的递归和非递归的实现

我们不难发现在这棵树中有很多结点会重复的,而且重复的结点数会随着n的增大而急剧增加。这意味这计算量会随着n的增大而急剧增大。事实上,用递归方法计算的时间复杂度是以n的指数的方式递增的.

斐波那契序列的递归和非递归的实现

         在分析算法的时间复杂度的时候,我们也可以得到相同的结果,非递归使用的是for循环,其时间复杂度为O(n)。而递归的时间复杂度则比较复杂,其分析出来为O(2^n)。

         这里需要说明的就是,非递归的for循环其时间复杂度O(n)虽然很小,但是其空间复杂度缺比递归调用差得多。因为,for循环在每次循环的时候,都把相应的数值保存下来了,而递归调用却不会保存相应的数值。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI