记忆体化的装饰器

我们先看一个斐波那契数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def fib(i):
if i<2:return 1
return fib(i-1)+fib(i-2)
print(fib(10)) #没问题
print(fib(100)) #似乎挂掉了
我们再看看加了记忆体化的装饰器的版本
from functools import wraps
def memo(func):
cache={}
@wraps(func)
def wrap(*args):
if args not in cache:
cache[args]=func(*args)
return cache[args]
return wrap
@memo
def fib(i):
if i<2:return 1
return fib(i-1)+fib(i-2)

试着再运行一次?没问题了吧?
那么这个装饰器函数有什么用?
我们举个例子,我们执行fib(6)的时候,普通情况下函数的调用是这样的




其实思路很简单,就是把递归调用的函数用一个空间存储起来。从而函数的调用变成了如下:


文章目录
|