python迭代器实现斐波拉契求值
斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为“兔子数列”:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。例如 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........这个数列从第3项开始,每一项都等于前两项之和,而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割比例0.618。
python中可以被
,next()
函数调用并不断返回下一个值的对象称为迭代器。用dir(list)dir(tuple)
,dir(file)
,dir(dict)
来查看不同类型对象的属性,会发现它们都有一个名为__iter__的特殊方法,对象有了这个属性,就能返回迭代器。迭代器不但可以作用于
for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了。
下面是使用不同方法实现斐波拉契求值
1、简单版本
#!/bin/env python def fib(n): a, b = 0, 1 for i in range(n): a, b = b, a+b return a print 'f5', fib(5) print 'f10', fib(10)
运行结果
f5 5
f10 55
2、递归版本
#!/bin/env python def fib(n): if 0 == n: return 0 elif 1 == n: return 1 else: return fib(n-1) + fib(n-2) print 'f5', fib(5) print 'f10', fib(10)
运行结果
f5 5
f10 55
3、迭代器版本
class Fib(): def __init__(self, n): self.a = 0 self.b = 1 self.n = n self.count = 0 def __iter__(self): return self def next(self): res = self.a self.a, self.b = self.b, self.a + self.b if self.count > self.n: raise StopIteration self.count += 1 return res print 'f5', list(Fib(5)) print 'f10', list(Fib(10))
运行结果
f5 [0, 1, 1, 2, 3, 5]
f10 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
迭代器使用的地方还有很多,例如读取文件等
原创文章,转载请备注原文地址 http://www.cnblogs.com/lxmhhy/p/6045265.html
知识交流讨论请加qq群:180214441。谢谢合作。