1 回答

TA贡献1847条经验 获得超7个赞
该from module import function语句将模块中的函数别名为function. 因此,当它被装饰时,只有别名被装饰。递归调用是针对未别名函数(在模块中),即未修饰的函数。
您可以将此视为创建部分内存,别名函数将记住其自身计算的结果,但不会记住中间步骤。在上面的代码中,fibonacci(100)完成后将是字典中的唯一条目。(不要等待它。)
使用import module语法不会为函数起别名,module.function它是“真实”名称。因此,应用于的装饰fibonacci.fibonacci也将装饰被递归调用的函数。
工作实施:
import fibonacci
def with_memoization(function):
past_results = {}
def function_with_memoization(*args, **kwargs):
if args not in past_results:
past_results[args] = function(*args, **kwargs)
return past_results[args]
return function_with_memoization
fibonacci.fibonacci = with_memoization(fibonacci.fibonacci)
print(fibonacci.fibonacci(100))
添加回答
举报