#定义装饰器,记录计算中间结果防止重复计算
def memoize(f):
memo = {}
def helper(x):
if x not in memo:
memo[x] = f(x)
return memo[x]
return helper
@memoize
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
def fib_seq(n):
res = []
if n > 0:
res.extend(fib_seq(n-1))
res.append(fib(n))
return res
fib_seq(30)
上面只是为了用装饰器,当然最推荐的是使用yield 关键字来实现:
def fib_yield(n):
a, b = 0, 1
while n > 0:
yield b
a, b = b, a + b
n -= 1
```
从性能而言,第二种实现方式是最优的,第一种方式只是为了记录装饰器的写法。