斐波纳契数列编程实现

斐波纳契(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)

你可能感兴趣的:(算法,python,fibonacci,斐波纳契)