簡體   English   中英

Python:無法在 Function 中調用記憶

[英]Python: Memoization can't be called in Function

無法啟動記憶。 如果我將它設為全局memo ,那么隨后的打印 function 將在第一次打印期間獲取存儲的備忘錄。 請指教,

def howsumhelper(targetsum,numbers):
      memo = dict() #this memoization will not initiate. Why?
      return howsum(targetsum,numbers,[])


def howsum(targetsum,numbers,combo):
      print("Debug==",memo)
      if targetsum in memo: return memo[targetsum]
      if targetsum == 0:return combo
      if targetsum < 0: return None

      for number in numbers:
            remainder = targetsum - number
            if howsum(remainder,numbers,combo) != None:
                  combo.append(number)
                  memo[targetsum] = combo
                  return combo
      memo[targetsum] = None
      return None

print(howsumhelper(7,[3,4])) #output should be [3,4]
print(howsumhelper(8,[2,3])) #output should be [2,2,2,2]
print(howsumhelper(7,[2,4])) #output should be None

建議以下更改

  • 使 memo 成為 howsum 的可變默認參數(使其可在函數中調用)
  • 你不需要 howsumhelper

參考——Python 中的高效記憶——使用發布的解決方案 #2

修訂代碼

def howsum(targetsum,numbers,combo=None,memo=None):
      # Initiaze default arguments
      if combo is None:
        combo = []
      if memo is None:
        memo = {}
        
      #print("Debug==",memo)
      if targetsum in memo: return memo[targetsum]
      if targetsum == 0:return combo
      if targetsum < 0: return None

      for number in numbers:
            remainder = targetsum - number
            if howsum(remainder,numbers,combo,memo) != None:
                  combo.append(number)
                  memo[targetsum] = combo
                  return combo
      memo[targetsum] = None
      return None

print(howsum(7,[3,4])) #output should be [3,4] #actually or [4, 3]
print(howsum(8,[2,3])) #output should be [2,2,2,2]
print(howsum(7,[2,4])) #output should be None

Output

[4, 3]
[2, 2, 2, 2]
None

解釋

Function 簽名是:howsum(targetsum,numbers,combo=None,memo=None):

Arguments function 定義中的一個值稱為默認 arguments。 所以組合和備忘錄都有默認的 arguments。

Python 的默認 arguments 在定義 function 時評估一次,而不是每次調用 function 時評估一次。

僅當傳遞實際值時才使用默認值。

因此:

howsum(7,[3,4]) # uses default values, so called with combo = None and memo = None
howsum(8,[2,3]) # uses default values, so called with combo = None and memo = None
howsum(7,[2,4]) # uses default values, so called with combo = None and memo = None

但:

howsum(remainder,numbers,combo,memo) # does not use defaults for combo and memo
                                     # since we are passing values for these arguments

暫無
暫無

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

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