面试题9

面试题9:斐波那契数列

题目:写一个函数,输入n,求斐波那契数列的第n项

  • 方法一:使用递归。
#include<iostream>
#include<stdlib.h>
using namespace std;
//方法一
long long Fib(unsigned int n)
{
	if(n<=0)
		return n;
	if(n==1)
		return n;
	return Fib(n-1)+Fib(n-2);
}
int main()
{
	int f=Fib(10);
	cout<<f<<endl;
	system("pause");
	return 0;
}
   递归 方法存在明显的不足,该方法的时间复杂度是n的指数级别,随着n的增大,运算时间不可想象,比如说f(50)就要很久。时间复杂度之所以这么大,是因此计算过程中存在着重复计算。以f(10)为例,f(10)=f(9)+f(8),f(9)=f(8)+f(7)。其中的f(8)就是重复计算的。

   方法2:开辟一个长度为(n+1)的数组
前面我们计算斐波那契数列是从后往前计算的,就是计算f(n)=f(n-1)+f(n-2),然后再递归计算f(n-1),又是从后往前计算,就是因为这样的从后往前计算,所以才会有很多的重复计算。那么我们可以逆转思路,考虑从前往后计算。比如我们要计算f(4),那么我们就计算f(0)、f(1)、f(2)、f(3),将这些计算出来的值保存在一个数组arr[n+1]上,这样计算斐波那契数列就相当于是一个填表的过程。时间复杂度大大降低。代码实例如下:
int Fib(int n)
{
	if(n<=0)
		return n;
	else if(n==1)
		return n;
	else
	{
        int *arr=new int[n+1];
	    arr[0]=0;
		arr[1]=1;
		for(int i=2;i<=n;i++)
		{
			arr[i]=arr[i-1]+arr[i-2];
		}
		int ret=arr[n];
		delete[] arr;
		return ret;
	}
} 
int main()
{
	int f=Fib(10);
	cout<<f<<endl;
	system("pause");
	return 0;
}

    方法3:优化方法2,空间复杂度为O(1),时间复杂度为O(n)

int Fib(int n)
{
	if(n<=0)
		return 0;
	else if(n==1)
		return 1;
	else
	{
		int num1=0;
		int num2=1;
		int fn=0;
		for(int i=2;i<=n;i++)
		{
			fn=num1+num2;
			num1=num2;
			num2=fn;
		}
		return fn;
	}
}
int main()
{
	int f=Fib(10);
	cout<<f<<endl;
	system("pause");
	return 0;
}




    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值