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

前段时间参加网易笔试,遇到这么一个题,实现斐波那契数列,要求时间复杂度尽可能小,但必须小于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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值