斐波那契数列的各种实现方式
---------------------斐波那契数列 # 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))
为什么要坚持,想一想当初!