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))
添加回答
舉報