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

  • 相关阅读:
    tp6.0使用EasyWeChat
    vue-admin-template使用
    tp6.0入门
    seo一些细节
    wordpress开发mac
    php加密
    小程序信息授权sessionKey失效问题
    app爬虫(python)开发——抓包工具的使用详细笔记
    app爬虫(python)开发——搭建开发环境(如何抓取app数据?)
    app爬虫(python)开发入门到实战个人笔记(目录)
  • 原文地址:https://www.cnblogs.com/lxmhhy/p/6045265.html
Copyright © 2020-2023  润新知