我正在学习Composing Programs中的优化.我有三个功能.memo
是用于记忆技术的,count
是包装器,所以每次调用fib
都会激活一个计数器.fib
只是具有递归性的斐波纳契数组的一个实现.
def memo(f):
cache = {}
def memoized(n):
if n not in cache:
cache[n] = f(n)
return cache[n]
return memoized
def count(f):
def counted(*args):
counted.call_count += 1
return f(*args)
counted.call_count = 0
return counted
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
return fib(n - 2) + fib(n - 1)
为了调用函数,我把count(fib)
改为counted_fib
, so every call is recorded.,并重新设计了*fib
*变量(现在,fib
不是原来的函数了)
counted_fib = count(fib)
fib = memo(counted_fib)
我的问题开始于函数fib
被调用时(例如fib(19)
),一切正常工作,但原始函数(return fib(n - 2) + fib(n - 1)
)内的递归将fib
触发为memo(counted_fib)
.
这不是什么不起作用的东西的问题.我只是在试着理解,如果一件事在另一件事之前宣布,为什么会发生这种情况.