斐波那契数列的两种实现方式(递归(大于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;
}
复制代码
之前看到过这样的实现方式,好像很简单,可是就是想不起来了,当然递归实现是大家都会的,可是他的时间复杂度超过了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;
}
复制代码
相关文章推荐
- 斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录
- C语言实现斐波那契数列的两种方法(递归和迭代)
- 斐波那契数的两种实现方式———1.递归实现,2迭代实现
- 递归和迭代两种方式实现归并排序(Java版)
- MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- 斐波那契数列数列递归与非递归方式实现
- [Algorithms, C] long2char: 自己用C写来玩玩的整形转化为字符串函数 (递归和迭代两种实现): void long2char(long from, char *to, int n);
- 格雷码的几种实现方式 递归 迭代 递推
- 分别用的列表,递归,生成器三种方式创建出n个元素的斐波那契数列(Python3实现)
- 链表翻转的图文讲解(递归与迭代两种实现)
- php递归与迭代实现斐波那契数列
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- 斐波那契数列迭代和递归实现
- 递归和循环两种方式实现未知维度集合的笛卡尔积
- 斐波那契数列的递归和迭代实现之差异
- DP 之 CODE[VS] 1048 石子归并 (两种实现方式:递归,循环)
- 二分查找的两种实现方式(递归和非递归)--python实现
- 请用递归和迭代两种方式输出文件目录结构
- JAVA:递归和迭代两种方法计算斐波那契数列