使用python迭代器生成斐波那契数列

斐波纳契数列以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

这个数列从第2项开始,每一项都等于前两项之和,而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618.

首先可以通过简单的for循环实现

#!/usr/bin/env python
def fib(n):
    a,b = 0,1
    for i in range(n):
        a,b =b,a+b
    print a
f = fib(10)
print f

通过递归函数调用实现更明了。

#!/usr/bin/env python
def fib(n):
    """
    This is Fibonacci by Recursion.
    """
    if n==0:
        return 0
    elif n==1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

if __name__ == "__main__":
    f = fib(10)
    print f

用dir(list) , dir(tuple) , dir(file) , dir(dict) 来查看不同类型对象的属性

会发现它们都有一个名为__iter__的特殊方法,对象有它,就能通过该方法返回迭代器,所谓的迭代器就是具有next()方法的对象,在调用next()方法时,

迭代器会返回它的下一个值。如果next()方法没有被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。

如果列表太大,使用列表会占用太多的内存,这时候需要的是迭代对象。

 #!/usr/bin/env python
class Fibs():
     def __init__(self,max):
         self.a = 0
         self.b = 1
         self.max = max
    def __iter__(self):
        return self
    def next(self):
        fib = self.a
        self.a,self.b = self.b,self.a + self.b
        if fib > self.max:
          raise StopIteration
        return fib
if __name__ == "__main__":
     fibs = Fibs(10000)
     print list(fibs)

$python fib.py
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
如果一个类想被用于 for 循环,类似list或tuple那样,通过__iter__方法返回迭代对象可以实现。


     
if __name__=="__main__"
fibs = Fibs(10000)
     lst = []
     for f in fibs:
         lst.append(f)
     print lst


 
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]


若要在斐波那契数列中找出大于1000的最小的数,一定记得要加break

  1 #!/usr/bin/env python
  2 class Fibs():
  3    def __init__(self):
  4       self.a = 0
  5       self.b = 1
  6    def __iter__(self):
  7       return self
  8    def next(self):
  9       fib = self.a
 10       self.a,self.b = self.b,self.a + self.b
 11       return fib
 12 if __name__ == "__main__":
 13    fibs = Fibs()
 14     
 15    for f in fibs:
 16        
 17        if f > 7000:
 18           print f
 19           break 

10946





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值