C++实现对斐波那契数列的优化

知道程序递归实现算法的程序员一般都接触过斐波那契数列,即:
F(n)={1,n=1;1,n=2;F(n-1)+F(n-2)}
递归代码如下:

int Fib1(int n)
{
	if (n<1)
	{
		return -1;
	}
	if (n==1||n==2)
	{
		return 1;
	}
	return  Fib1(n - 1) + Fib1(n - 2);
}

但是它的时间复杂度是:

在这里插入图片描述

请注意,是指数级!
所以,接下来给出优化版实现:
分析:事件复杂度较高的原因是:每次计算n的时候,都要重复计算n-1和n-2,因此增大了事件复杂度,如果事先用数组保存之前的数据,就会减少计算次数:

int Fib2(int n)
{
	if (n<1)
	{
		return -1;
	}
	int *array = new int[n];
	array[0] = 1;
	array[1] = 1;
	for (int i=2;i<n;i++)
	{
		array[i] = array[i - 1] + array[i - 2];
	}
	return array[n-1];
}

上面的代码瞬间将指数级降至O(n)级别,但是有没有更好的算法呢,有的,请继续看:

    int Fib3(int n)
{
	int a1 = 1;
	int a2 = 1;
	if (n<1)
	{
		return -1;
	}
	if (n==1||n==2)
	{
		return 1;
	}
	for (int i=3;i<=n;i++)
	{
		a2 = a2 + a1;
		a1 = a2 - a1;
	}
	return  a2;
}

这样,虽然时间复杂度没有改变,但是空间复杂度再次降低

猜你喜欢

转载自blog.csdn.net/qq_36696486/article/details/84640933