斐波纳契数列以递归的方法定义: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