歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python迭代器實現斐波拉契求值

  斐波納契數列以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。這個數列從第2項開始,每一項都等於前兩項之和,而且當n趨向於無窮大時,前一項與後一項的比值越來越逼近黃金分割0.618。

  用dir(list),dir(tuple),dir(file),dir(dict)來查看不同類型對象的屬性,會發現它們都有一個名為__iter__的特殊方法,對象有它,就能通過該方法返回迭代器,所謂的迭代器就是具有next()方法的對象,在調用next()方法時,迭代器會返回它的下一個值。如果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]

迭代器的使用之地還有很多,例如讀取文件等

Copyright © Linux教程網 All Rights Reserved