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

来源:互联网 发布:dnf刷图老是网络中断 编辑:程序博客网 时间:2024/05/10 18:40
前段时间参加网易笔试,遇到这么一个题,实现斐波那契数列,要求时间复杂度尽可能小,但必须小于O(n方)
之前看到过这样的实现方式,好像很简单,可是就是想不起来了,当然递归实现是大家都会的,可是他的时间复杂度超过了O(n方),所以用递归肯定是不符合要求的,我当时想到的是,递归的时候,每求一个元素值就要把他之前的所有元素的计算都计算一遍,这必然降低了效率,如果改进的话就是先把之前元素得到的计算值保存,当计算下一个元素值时,直接利用已经保存的值,而无需重新计算,提高效率。回来后查了一下才知道,这种方法叫做迭代,这可不就是迭代吗。。。迭代的方法效率比较高,时间复杂度是O(n),空间复杂度是O(1)。
当然,如果实现有限个数字的输出,也可以用数组的形式,但这个效率比较低。
代码实现:


  1. //递归实现斐波那契数列   
  2. int Fib1(int index)  
  3. {  
  4.     if(index < 1)  
  5.     {  
  6.         return -1;  
  7.     }  
  8.     if(1 == index|| 2 == index)  
  9.     {  
  10.         return 1;  
  11.     }  
  12.     else  
  13.         return Fib1(index-1)+Fib1(index-2);  
  14. }  
复制代码
  1. //数组实现   
  2. #define NUM 40   
  3. int Fib2()  
  4. {  
  5.     int array[NUM];  
  6.     array[0] = array[1] = 1;  
  7.     for(int i = 2; i < NUM; i++)  
  8.     {  
  9.         array[i] = array[i-1] + array[i-2];  
  10.     }  
  11.     return array[NUM];  
  12.   
  13. }  
复制代码
  1. //迭代实现,复杂度低   
  2. int Fib5(int index)  
  3. {  
  4.     if(index < 1)  
  5.     {  
  6.         return -1;  
  7.     }  
  8.   
  9.     int val1=1,val2=1,val3=1;  
  10.   
  11.     for(int i=0;i<index-2;i++)  
  12.     {  
  13.         val3=val1+val2;  
  14.         val1=val2;  
  15.         val2=val3;  
  16.     }  
  17.     return val3;  
  18. }  
复制代码

原创粉丝点击