斐波纳契数列编程实现

斐波纳契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。
     当n = 0, fib(n) = 1;
     当n = 1, fib(n) = 1;
     当n > 1, fib(n) = fib(n-1) + fib(n-2)
     解法1:
          直接根据数列描述,由递归的方式解决。
     
  1 def fib(a):
  2     assert a >=0
  3     if a in [0, 1]:
  4         return 1
  5     else:
  6         return fab(a-1) + fab(a-2)
     运行即可正确得出结果。但是细心的你会发现,如果求一个稍微大一点的数字的fib, 则系统会卡死。比如fib(100)。这是因为使用递归的方式计算时,会出现多次重复计算的过程,而这些重复计算消耗了大量的计算资源。
     于是最直接能想到的解决方法就是将之前的计算结果缓存起来,于是得到如下解决方案——
     解法2:
   
  1 dcache = {0:1, 1:1}
  2 def fib2(a):
  3      global dcache
  4      if a in dcache.keys():
  5           return dcache[a]
  6      else:
  7           dcache[a] = fab3(a-1) + fab3(a-2)
  8      return dcache[a]
   这样做是一个典型的以空间换取时间的做法,但是如果数字再大一点,使得dcache中存储的内容超过系统内存时,又会出现卡死的现象了。那么,还有没有更优化一点的方法呢?
     解法3:
 
  1 def fib3(a):
  2      fa, fb = 0, 1
  3      for i in xrange(a):
  4          fa, fb = fb, fa + fb
  5      return fb
     显然,第三种解法以递归的方式计算,既避免了迭代所导致的重复计算,又取消了全局缓存,使得计算效率更高。
 
     普及:
     一台4G内存的电脑,stack size设置为8192 (ulimit -a), 则最大可以跑512个线程(4G/8M)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值