您的位置:首页 > 其它

斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录

2013-11-24 16:57 435 查看
前段时间参加网易笔试,遇到这么一个题,实现斐波那契数列,要求时间复杂度尽可能小,但必须小于O(n方)

之前看到过这样的实现方式,好像很简单,可是就是想不起来了,当然递归实现是大家都会的,可是他的时间复杂度超过了O(n方),所以用递归肯定是不符合要求的,我当时想到的是,递归的时候,每求一个元素值就要把他之前的所有元素的计算都计算一遍,这必然降低了效率,如果改进的话就是先把之前元素得到的计算值保存,当计算下一个元素值时,直接利用已经保存的值,而无需重新计算,提高效率。回来后查了一下才知道,这种方法叫做迭代,这可不就是迭代吗。。。迭代的方法效率比较高,时间复杂度是O(n),空间复杂度是O(1)。

当然,如果实现有限个数字的输出,也可以用数组的形式,但这个效率比较低。

代码实现:

//递归实现斐波那契数列

int Fib1(int index)

{

if(index < 1)

{

return -1;

}

if(1 == index|| 2 == index)

{

return 1;

}

else

return Fib1(index-1)+Fib1(index-2);

}

复制代码

//数组实现

#define NUM 40

int Fib2()

{

int array[NUM];

array[0] = array[1] = 1;

for(int i = 2; i < NUM; i++)

{

array[i] = array[i-1] + array[i-2];

}

return array[NUM];



}

复制代码

//迭代实现,复杂度低

int Fib5(int index)

{

if(index < 1)

{

return -1;

}



int val1=1,val2=1,val3=1;



for(int i=0;i<index-2;i++)

{

val3=val1+val2;

val1=val2;

val2=val3;

}

return val3;

}

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