斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、55、89、144、、、
代码实现:
1、打印100以内的fib
print(0)
print(1)
a=0
b=1
while True:
c = a+b
if c >100:
break
a = b
b = c #每循环一次,b的值都重新赋给a,c的和都重新赋值给b
print(c)
2、打印fib的第101项
a = 0
b = 1
print(0,0)
print(1,1)
index = 1
while True:
c = a+b
index +=1
print('index={},fib={}'.format(index,c))
a = b
b = c
if index==101:break
3、函数循环,并打印101项
def fib_v1(n):
a=b=1
for i in range(n-2):
a,b=b,a+b
return b
fib_v1(101)
4、递归函数
def fib_v2(n): #慢
if n<3:
return 1
return fib_v2(n-1) + fib_v2(n-2)
fib_v2(35)
#或者:
def fib_v2(n):
return 1 if n <3 else fib_v2(n-1)+fib_v2(n-2)
fib_v2(35)
5、使用functools模块
from functools import lru_cache
@lru_cache()
def fib(n):
return 1 if n <3 else fib(n-1) + fib(n-2)
fib(101)
-----
573147844013817084101
6、定义一个斐波那契数列的类,要求方便调用,计算第n项。有增加迭代数列的方法、返回数列长度、支持索引查找数列项。
class Fib:
def __init__(self):
self.items = [0,1,1]
def __call__(self, index):
# return self.__getitem__(index)
return self[index] #转而调用__getitem__
def __iter__(self):
yield from self.items
def __len__(self):
return len(self.items)
def __getitem__(self, index):
if index < 0:
raise IndexError('Wrong Index')
for i in range(len(self), index+1): #index >= len(self.items)
self.items.append(self.items[i-1] + self.items[i-2])
return self.items[index]
# __call__ = __getitem__
def __str__(self):
return str(self.items)
__repr__ = __str__
-----------------------------------
fib = Fib()
print(fib(5), len(fib)) ---> 5 6
for x in enumerate(fib):
print(x, end='\t') ---> (0, 0) (1, 1) (2, 1) (3, 2) (4, 3) (5, 5)
print(fib[5], fib[6], fib) ---> 5 8 [0, 1, 1, 2, 3, 5, 8]