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

  • 相关阅读:
    单元测试
    python gdb
    圣诞树
    网络是怎样连接的 读书笔记
    POJ2104 K-th Number(整体二分)
    [SDOI2011]消耗战
    [HNOI2011]XOR和路径
    [HNOI2013]游走
    [JSOI2008]球形空间产生器
    POJ2728 Desert King
  • 原文地址:https://www.cnblogs.com/lxmhhy/p/6045265.html
Copyright © 2020-2023  润新知