斐波那契数列:1,1,2,3,5,8,13,21,34,55……
写一个函数,输入n,求斐波那契数列的第n项。
f(n) = 0;n=0
f(n) = 1;n=1
f(n) = f(n-1)+f(n-2);n>1
解法1:递归
long long Fibonacci(unsigned int n)
{
if(n <= 0)
{
return 0;
}
if(n == 1)
{
return 1;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
这是最基本的解法,但是当输入的n值较大时,许多值是重复计算的,(比如输入n值为10,那么接下来计算9和8的值,计算9的值时计算8和7的值,计算8的值时应先计算7和6的值……以此类推)所以其时间复杂度是以n的指数的方式递增的。
解法2:循环
long long Fibonacci(unsigned int n)
{
int result[2] = {0,1};
if(n < 2)
{
return result[n];
}
long long fibonacciOne = 1;
long long fibonacciTwo = 0;
long long fibN = 0;
for(unsigned int i = 2;i<=n;i++)
{
fibN = fibonacciOne + fibonacciTwo;
fibonacciTwo = fibonacciOne;
fibonacciOne = fibN;
}
return fibN;
}
这是最实用的解法,从下往上依次计算。
我们可以实验一下,在分别调用这两个函数前调用GetTickCount()函数获取开始时间,调用返回后再次获取时间。
当输入25以下的数时,两个函数效率基本相同,但是当输入25以上的数时第二个函数的效率显然比第一个函数的效率高。