Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1591038
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2008-08-16 15:09:55

Fibonacci数列,我想有的人在大学甚至高中就已经接触过了,其数学表达如下:
给定一正整数x,
F(x) = 1 ( x=1 或 x=2)
F(x) = F(x-1) + F(x-2) ( x > 2 )
也就是说,前2个数是1, 后面的的数, 是前面2个数之和

如果用计算机来解决的话, 可有递归和非递归算法, 对于递归算法很好理解, 也很好实现,直接照着上面的公式来就行了, 下面是递归算法的c语言实现:


long fab(int n)
    {
        if ( n == 1 || n == 2 )
            return 1;
        else
            return fab(n-1) + fab(n-2);
    }    


可以看见,代码非常的简单,也很好理解,然而, 这个效率是极其低下, 我试图打印前50个数, 结果发现程序运行了近2分钟才返回,打印的越多, 运行的越慢, 所耗费的时间成级数增长。

下面是非递归算法, 虽然看起来复杂一些, 但是时间复杂度却是O(n)。而且同样打印前面50个数, 只用了1秒钟, 可见,这个差别是多么的巨大。 下面是非递归算法的c语言代码:

long fabx(int n)
    {
        if ( n == 1 || n == 2 )
            return 1;
        
        long xx = 1;
        long yy = 1;
        long res = 0;
        for ( int i = 0; i < n - 2 ; i++ )
        {
            res = xx + yy;
            xx = yy;
            yy = res;            
        }
        return res;
    }    

阅读(1709) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-11-26 21:16:42

朋友,谢谢你提供的算法! 不过,fibonacci数列应该是从0始的吧,这点也要考虑下,另外,我在VC++6.0下试了非递归算法,当n取47时,结果开始出现负数(不知道这点算不算是问题?我不太明白,希望有机会一起探讨下)469425789(网络晨星)

chinaunix网友2009-11-26 21:16:42

朋友,谢谢你提供的算法! 不过,fibonacci数列应该是从0始的吧,这点也要考虑下,另外,我在VC++6.0下试了非递归算法,当n取47时,结果开始出现负数(不知道这点算不算是问题?我不太明白,希望有机会一起探讨下)469425789(网络晨星)