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