我们先看一个斐波那契数列12345678910111213141516171819def fib(i): if i<2:return 1 return fib(i-1)+fib(i-2)print(fib(10)) #没问题print(fib(100)) #似乎挂掉了我们再看看加了记忆体化的装饰器的版本from functools import wrapsdef memo(func): cache={} def wrap(*args): if args not in cache: cache[args]=func(*args) return cache[args] return wrapdef fib(i): if i<2:return 1 return fib(i-1)+fib(i-2)
试着再运行一次?没问题了吧?
那么这个装饰器函数有什么用?
我们举个例子,我们执行fib(6)的时候,普通情况下函数的调用是这样的
其实思路很简单,就是把递归调用的函数用一个空间存储起来。从而函数的调用变成了如下: