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

posted @ 2016-11-08 23:53  RunningPower  阅读(1296)  评论(0编辑  收藏  举报