斐波那契数算法优化

      在很多算法都用到了递归算法,谈到递归就难免要提到斐波那契数的算法。

     最一般的算法如下(C#语法):        

 private long Fibonacci(int n)
        {
            if (n == 1 || n == 2)
                return 1;
            else if (n > 2)
                return Fibonacci(n - 1) + Fibonacci(n - 2);
            else
                return 0;
        }

    运行测试下,发现当参数n=39时运行速度就变的很慢了,我计算了下,大概3-4秒,而当n=42时,已然要10来秒才能完成,当n=45时就没反应了,一两分钟都没有结果。

    其实仔细分析下可以Fibonacci方法在被调用后,向下调用就翻倍地调用了下一级的Fibonacci方法。

    计算了一下,假设斐波那契数数列的第N项的值是an(n)的话,那么调用上面的递归算法,Fibonacci方法会被调用 an(n) *2 +1 次,当n=39时an(39)=63245986,Fibonacci方法被调用了126491971次,效率之低可以见一斑。

   这里我做了下优化,算法如下:

private long Fibonacci(int n,out long m)
        {
            long t, r;
            if (n == 1)
            {
                m=0;
                return 1;
            }
            else if (n == 2)
            {
                m = 1;
                return 1;
            }
            else if (n > 2)
            {
                t = Fibonacci(n - 1, out m);
                r = t + m;
                m = t;
                return r;
            }
            else
            {
                m = 0;
                return 0;
            }
        }

此处的最大优化在于保存计算项之前的每一项的值,每一项的计算只调用Fibonacci方法一次,实际调用Fibonacci方法的次数只有n-1次,如果n=33,那么调用Fibonacci方法只有32次。

    看看方法的调用次数就可知算法的效率了。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值