做者:Elliott Saslow算法
翻译:老齐bash
与本文相关的图书推荐:《Python大学实用教程》《跟老齐学Python:轻松入门》markdown
众所周知,斐波那契数列是一种很是重要的数列。函数
0,1,1,2,3,4,8,13,21,34,55,...
复制代码
用递归的方式,能够这样定义斐波那契数列:oop
按照上面的公式,能够用Python语言直接写出实现它的函数:测试
def fib_recursive(n): if n == 0: return 0 if n == 1: return 1 else: return(fib_recursive(n-1)+fib_recursive(n-2)) 复制代码
无论何时,咱们遇到某个算法的实现,总要问一问下面的问题:spa
如今,无需深刻了解具体细节,用递归方式,属于贪心算法,须要花费大量计算步骤来完成。所以,让咱们尝试使用列表来完成此操做,下面的方法能够加快处理速度并简化计算。翻译
def fib_poly(n): #注意0 if n == 0: return 0 #用列表保存数值 else: f = np.zeros(n+1) f[0] = 0 f[1] = 1 for i in range(2,n+1): f[i] = f[i-1] + f[i-2] return f[n] 复制代码
Ok,来看看它的表现。下图显示了执行上面两个函数的所用时间比较。3d
哇!注意观察它们所用时间的差异!后面这个函数比前面的递归方法快多了。code
下面的图示中很明显地表示了两者执行时间的差别。
哇! 使人难以置信,递归竟然如此慢。还有更快的方法呢? 应该有:
以下所示,能够用矩阵的方法计算斐波那契数列,会更快。
import numpy as np def fib_matrix(n): Matrix = np.matrix([[0,1],[1,1]]) vec = np.array([[0],[1]]) return np.matmul(Matrix**n,vec) 复制代码
这真的很酷,在整个测试过程当中,矩阵算法在几乎恒定的时间内执行。关于用矩阵实现斐波那契数列的方法,能够参考 《跟老齐学Python:数据分析》 ,书中有相关说明。
注: 此外,斐波那契数列还可以用生成器、迭代器方式实现,这些实现方法,能够到 《Python大学实用教程》 查阅。
搜索技术问答的公众号:老齐教室
在公众号中回复:老齐,可查看全部文章归类。