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。谢谢合作。

上一篇:延迟求值-如何让Lo-Dash再提速x100?


下一篇:萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)