您的位置:首页 > 其它

斐波那契数列

2015-07-06 15:29 363 查看
题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:








效率很低的解法如下:



long long Fibonacci(unsigned int n)

{

if(n<=0)

return 0;

if(n==1)

return 1;

return Fibonacci(n-1)+Fibonacci(n-2);

}








实上,用递归方式计算的时间复杂度是以n的指数的方式递增的。



实用的解法



为了避免重复计算,将数列中间项保存起来,下次需要计算的时候先查一下,如果前面已经计算过,就不用再重复计算了。

从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3).........依此类推就可以算出第n项,时间复杂度为O(n),代码如下:

long long Fibonacci(unsigned n)

{

int result[2] = { 0, 1 };

if (n < 2)

return result
;

long long fibNMinusOne = 1;

long long fibNMinusTwo = 0;

long long fibN = 0;

for (unsigned int i = 2; i <= n; ++i)

{

fibN = fibNMinusOne + fibNMinusTwo;

fibNMinusTwo = fibNMinusOne;

fibNMinusOne = fibN;

}

return fibN;

}





时间复杂度为O(logn)但不实用的解法



介绍这种方法之前,先介绍一个数学公式:
















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: