1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| """ 函数递归调用 - 函数直接或者间接的调用了自身 1. 收敛条件 2. 递归公式
n! = n * (n-1)! f(n) = f(n-1) + f(n-2) 1 1 2 3 5 8 13 21 34 55 ... """ from contextlib import contextmanager from time import perf_counter
def fac(num): """求阶乘""" assert num >= 0 if num in (0, 1): return 1 return num * fac(num - 1)
def fib2(num): """普通函数""" a, b = 1, 1 for _ in range(num - 1): a, b = b, a + b return a
def fib3(num): """生成器""" a, b = 0, 1 for _ in range(num): a, b = b, a + b yield a
def fib(num, results={}): """斐波拉切数""" assert num > 0 if num in (1, 2): return 1 try: return results[num] except KeyError: results[num] = fib(num - 1) + fib(num - 2) return results[num]
@contextmanager def timer(): try: start = perf_counter() yield finally: end = perf_counter() print(f'{end - start}秒')
def main(): """主函数""" for num in range(1, 121): with timer(): print(f'{num}: {fib(num)}')
if __name__ == '__main__': main()
|