[英]Recursion in closures Python
# -*- coding: utf-8 -*-
def memoize(limit, *, message = 'Limit exceded'):
count = 0
def inner(func):
cache = {}
def wrapped(number):
nonlocal count
if count < limit:
if number not in cache:
cache[number] = func(number)
count += 1
return cache[number]
print(message)
return wrapped
return inner
@memoize(5)
def fat(x):
if x < 2:
return 1
return x * fat(x - 1)
從理論上講,該算法應該接收一個可以設置結果存儲限制的數字,而不是引發異常,我只是顯示已傳遞的消息或默認值(“限制超出”),以防萬一達到緩存。 問題是它只運行一次程序並顯示消息,但錯誤在哪里?
您的代碼不是設置緩存大小的限制,而是設置包裝器的調用次數:
if number not in cache:
cache[number] = func(number)
count += 1
換句話說,您可以遞增count
該數字是否已在緩存中。 要解決此問題,您只需要縮進該增量即可。
最重要的是,不會為每個新的緩存重置count
,因為將其設置為0
的唯一位置是在外部函數中:
def memoize(limit, *, message = 'Limit exceded'):
count = 0
def inner(func):
cache = {}
要解決此問題,您需要將count = 0
從memoize
移動到inner
。 (或者,如果您願意,可以添加一個nonlocal count
並在inner
中將其重置為count = 0
,但這只是額外的工作,以達到相同的效果。)
但是,解決這兩個問題的一個更簡單的方法是完全消除count
。 您要計算是否已達到緩存中的存儲限制? 只需檢查if len(cache) < limit:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.