斐波那契数列的各种实现方式

---------------------斐波那契数列
# no1 最初始的版本 使用for循环完成,交换
def fib(n):
    a = 0
    b = 1
    for i in range(n):
        a, b = b, a + b
    return a
print(fib(3)) # 2

# no2.1 使用递归完成,但是这个版本的 递归效率极低,通过 ipython的jupyter 的%%timeit测试, 还不如循环。因为return的fib(n-1)+fib(n-2),d都要分别往下继续执行,数据量大的时候,这个相当于重复了很多,前面算了的,后面fib(n-2)里还要算一次,所以效率极低。
def fib(n):
    if n < 3:
        return 1
    return fib(n-1) + fib(n-2)

print(fib(3)) # 2

# no2.2 变形版本:
def fib(n):
    return 1 if n < 3 else fib(n-1) + fib(n-2)

print(fib(3)) # 2

# no 3 利用上次的结果的递归
# 这里使用 缺省参数作为运算结果,而n 作为循环次数控制量
def fib(n, a=0, b=1):               def fib(n, a=0, b=1):                   def fib(n, a=0, b=1):
    if n == 0:                          if n == 0:                               if n == 0:
        return a                             return a                               return a
    a, b = b, a + b                     a, b = b, a + b                           a, b = b, a + b
    return fib(n-1, a, b)              return fib(n-1, a, b)                     return fib(n-1, a, b)

print((fib(3)))

# no4 利用生成器实现
def fib():
    x = 0
    y = 1
    while True:
        yield y
        x, y = y, x + y
foo = fib()
for _ in range(5):
    print(next(foo))

# no5 利用 实例调用实现
class Fib:
    def __init__(self):
        self.items = [0, 1, 1]

    def __call__(self, index):
        if index >= len(self.items):
            for i in range(3, index + 1):
                self.items.append(self.items[i-1] + self.items[i-2])
        return self.items[index]

    def __iter__(self):
        yield  from self.items

    def __len__(self):
        return len(self.items)

    def __getitem__(self, item):
        return self.items[item]

    def __str__(self):
        return str(self.items)



f = Fib()
print(f(10))
print(f.items)
print(f(4))
print(f[4])
print(f.items)
print(len(f))
1 # no 7 利用缓存的递归版本
2 from functools import lru_cache
3 
4 @lru_cache()
5 def fib(n):
6     if n < 3:
7         return 1
8     return fib(n-1) + fib(n-2)
9 print(fib(40))
为什么要坚持,想一想当初!
原文地址:https://www.cnblogs.com/JerryZao/p/9683073.html