example03.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. """
  2. 函数递归调用 - 函数直接或者间接的调用了自身
  3. 1. 收敛条件
  4. 2. 递归公式
  5. n! = n * (n-1)!
  6. f(n) = f(n-1) + f(n-2)
  7. 1 1 2 3 5 8 13 21 34 55 ...
  8. """
  9. from contextlib import contextmanager
  10. from time import perf_counter
  11. def fac(num):
  12. """求阶乘"""
  13. assert num >= 0
  14. if num in (0, 1):
  15. return 1
  16. return num * fac(num - 1)
  17. def fib2(num):
  18. """普通函数"""
  19. a, b = 1, 1
  20. for _ in range(num - 1):
  21. a, b = b, a + b
  22. return a
  23. def fib3(num):
  24. """生成器"""
  25. a, b = 0, 1
  26. for _ in range(num):
  27. a, b = b, a + b
  28. yield a
  29. # 动态规划 - 保存可能进行重复运算的中间结果(空间换时间)
  30. def fib(num, results={}):
  31. """斐波拉切数"""
  32. assert num > 0
  33. if num in (1, 2):
  34. return 1
  35. try:
  36. return results[num]
  37. except KeyError:
  38. results[num] = fib(num - 1) + fib(num - 2)
  39. return results[num]
  40. @contextmanager
  41. def timer():
  42. try:
  43. start = perf_counter()
  44. yield
  45. finally:
  46. end = perf_counter()
  47. print(f'{end - start}秒')
  48. def main():
  49. """主函数"""
  50. # for val in fib3(20):
  51. # print(val)
  52. # gen = fib3(20)
  53. # for _ in range(10):
  54. # print(next(gen))
  55. for num in range(1, 121):
  56. with timer():
  57. print(f'{num}: {fib(num)}')
  58. # print(fac(5))
  59. # print(fac(-5))
  60. if __name__ == '__main__':
  61. main()