您的位置:首页 > 其它

递归和非递归方法实现斐波那契

2016-06-11 18:52 162 查看
斐波那契数列(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*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
斐波那契递归算法实现。
//递归实现斐波那契
long long Fibonacci(int n)
{
//if (n == 0 || n == 1)
//	return n;
//else
//	return Fibonacci(n - 1) + Fibonacci(n - 2);
return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2);
}
由于斐波那契递归算法时间复杂度:O(2^N)空间复杂度为:O(N),下面通过非递归实现斐波那契。
//非递归实现斐波那契-------时间复杂度O(n),空间复杂度O(n)
long long Fibonacci(int n)
{
long long *fibonacci = new long long[n + 1];//注意此处开辟n+1个空间
fibonacci[0] = 0;
fibonacci[1] = 1;
for (int i = 2; i <= n; i++)
{
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
long long ret = fibonacci
;
delete[] fibonacci;
return ret;
}
//非递归实现斐波那契--迭代法-------时间复杂度O(n),空间复杂度O(1)
long long Fibonacci(int n)
{
long long fibonacci[3] = { 0, 1, n };
fibonacci[0] = 0;
fibonacci[1] = 1;
for (int i = 2; i <= n; i++)
{
fibonacci[2] = fibonacci[1] + fibonacci[0];
fibonacci[0] = fibonacci[1];
fibonacci[1] = fibonacci[2];
}
return fibonacci[2];
}
//非递归实现斐波那契--迭代法-------空间复杂度O(n),时间复杂度O(1)
long long Fibonacci(int n)
{
long long result;
long long pre_result;
long long next_pre_result;
next_pre_result = 0;
pre_result = 1;
result = 0;
while (n > 0)
{
next_pre_result = pre_result;
pre_result = result;
result = next_pre_result + pre_result;
n--;
}
return result;
}
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1758144
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: