# -*- coding: utf-8 -*- # 1.递归法 def fib_recur(n): assert n >= 0 if n in (1, 0): return n return fib_recur(n-1) + fib_recur(n-2) # 2. 递推法 def fib_loop(n): a, b = 0, 1 for _ in range(n): a, b = b, a+b return a # 矩阵法 from numpy import matrix def fib_matr(n): return (matrix([[1, 1], [1, 0]]) ** (n - 1) * matrix([[1], [0]]))[0, 0] if __name__ == '__main__': for i in range(20): print(fib_matr(i), end=' ')
iterator
class Fib: def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self def __next__(self): value = self.curr self.curr += self.prev self.prev = value return value if __name__ == '__main__': from itertools import islice f = Fib() print(list(islice(f,0,10)))
generator
def fib(): prev, curr = 0, 1 while True: yield curr prev, curr = curr, curr + prev def main(): f = fib() # for _ in range(10): # print(next(f)) from itertools import islice print(list(islice(f, 0, 10))) if __name__ == '__main__': import cProfile cProfile.run('main()')