簡體   English   中英

遞歸閉包Python

[英]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 = 0memoize移動到inner (或者,如果您願意,可以添加一個nonlocal count並在inner中將其重置為count = 0 ,但這只是額外的工作,以達到相同的效果。)


但是,解決這兩個問題的一個更簡單的方法是完全消除count 您要計算是否已達到緩存中的存儲限制? 只需檢查if len(cache) < limit:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM